Tkinter 增加文本编辑器的字体大小时,底部的标签将消失

Tkinter 增加文本编辑器的字体大小时,底部的标签将消失,tkinter,text-editor,Tkinter,Text Editor,我正在用tkinter做一个文本编辑器。我注意到,当我将字体大小增加到16以上时,状态栏(底部的标签)会自动消失,当我将字体大小减少到17以下时,状态栏会重新出现。 下面是我的代码的最低可行示例。 我认为这是因为文本编辑器在字体大小增加时占用了更多的空间,但在任何情况下都不应该删除状态栏。 他们是否有任何补救措施,或者情况如何 from tkinter import ttk from tkinter.font import Font main_application = tk.Tk() ##

我正在用tkinter做一个文本编辑器。我注意到,当我将字体大小增加到16以上时,状态栏(底部的标签)会自动消失,当我将字体大小减少到17以下时,状态栏会重新出现。 下面是我的代码的最低可行示例。 我认为这是因为文本编辑器在字体大小增加时占用了更多的空间,但在任何情况下都不应该删除状态栏。 他们是否有任何补救措施,或者情况如何

from tkinter import ttk
from tkinter.font import Font

main_application = tk.Tk()

#################################### MAIN-MENU ###########################################
main_menu = tk.Menu()

File = tk.Menu(main_menu,tearoff=False)
main_menu.add_cascade(label='File',menu=File)


# #################################### TOOLBAR ###########################################
tool_bar = ttk.Label(main_application)
tool_bar.pack(side=tk.TOP,fill=tk.X)


##font size box
size_var = tk.IntVar()
font_size = ttk.Combobox(tool_bar, width=14,textvariable=size_var,state='readonly',cursor='hand2')
font_size['values'] = tuple(range(8,81,1))
font_size.current(2)
font_size.grid(row=0,column=6,padx=2)


#################################### TEXT-EDITOR ##########################################
text_editor = tk.Text(main_application)
text_editor.config(wrap='word',relief=tk.FLAT, undo=True)
text_editor.focus_set()

yscroll_bar = tk.Scrollbar(main_application)
yscroll_bar.pack(side=tk.RIGHT,fill=tk.Y)

text_editor.pack(fill=tk.BOTH,expand=True)
yscroll_bar.config(command=text_editor.yview)
text_editor.config(yscrollcommand=yscroll_bar.set)


#################################### STATUS BAR ##########################################
status_bar = ttk.Label(main_application,compound=tk.LEFT)
status_bar.pack(side=tk.BOTTOM,fill=tk.X)



#################################### MAIN-MENU FUNCTIONALITY ###########################################

## font family and font size functionality
my_font=Font(family='Arial',size=12)      
text_editor.configure(font=my_font)

## states of the formatting buttons
current_font_size = 12


def change_font_size(event=None):
    global current_font_size
    current_font_size = size_var.get()
    change_formatting()
font_size.bind("<<ComboboxSelected>>",change_font_size)


## to change formatting
def change_formatting():
    my_font.configure(size=current_font_size )



################################################## runner code ################################33333
main_application.state('zoomed')
main_application.config(menu=main_menu)
main_application.mainloop()
从tkinter导入ttk
从tkinter.font导入字体
主应用程序=tk.tk()
####################################主菜单###########################################
主菜单=tk.menu()
File=tk.Menu(主菜单,tearoff=False)
主菜单。添加级联(label='File',menu=File)
##################################################################################
工具条=ttk.标签(主应用程序)
工具条组件(侧面=顶部,填充=顶部)
##字号框
size_var=tk.IntVar()
font\u size=ttk.Combobox(工具栏,宽度=14,文本变量=size\u变量,状态='readonly',光标='hand2')
font_size['values']=元组(范围(8,81,1))
当前字体大小(2)
font\u size.grid(行=0,列=6,padx=2)
####################################文本编辑器##########################################
text\u editor=tk.text(主应用程序)
text_editor.config(wrap='word',relief=tk.FLAT,undo=True)
文本编辑器。焦点集()
yscroll\u bar=tk.Scrollbar(主应用程序)
yscroll_条形包装(侧面=右侧,填充=右侧)
text_editor.pack(fill=tk.BOTH,expand=True)
yscroll\u bar.config(command=text\u editor.yview)
text_editor.config(yscrollcommand=yscroll_bar.set)
####################################状态栏##########################################
状态条=ttk.标签(主应用,化合物=tk.左)
包装状态(侧面=底部,填充=底部)
####################################主菜单功能###########################################
##字体系列和字体大小功能
my_font=font(family='Arial',size=12)
文本编辑器。配置(字体=我的字体)
##格式化按钮的状态
当前字体大小=12
def更改字体大小(事件=无):
全局当前字体大小
当前字体大小=大小变量get()
更改格式()
字体大小。绑定(“,更改字体大小)
##更改格式
def change_formatting():
我的字体。配置(大小=当前字体大小)
##################################################跑步者守则
主应用程序状态(“缩放”)
main\u application.config(菜单=主菜单)
main_application.mainloop()

当您更改字体大小时,它会导致文本小部件增长,因为高度以行数表示,字体大小会更改行高

pack
实际向窗口添加小部件时,一旦窗口无法再增长,并且无法根据当前小部件的选项和请求的大小缩小,它将停止添加小部件。因此,随着文本小部件的不断增长,它最终会填满窗口。一旦窗口已满,
pack
停止向窗口添加小部件

这就是关于打包算法的规范化tcl/tk文档所说的(由我强调):

如果腔体太小,无法满足从属设备的需要,则将为从属设备提供腔体中剩余的任何空间。如果空腔缩小到零尺寸,则装箱单上的所有剩余从属设备将从屏幕上取消映射,直到主窗口变大,足以再次容纳它们

换句话说,它优先于较早打包的小部件,而不是较晚打包的小部件

一个简单的修复方法是在打包文本小部件之前打包statusbar。这样,状态栏就已经出现在屏幕上了,因此当您添加文本小部件时,
pack
会将其缩小以使其适合

这就是为什么将用于一组子对象的所有
pack
命令放在一起而不是将它们散布到整个代码中是有意义的。您可以按照您认为有意义的顺序创建小部件,然后按照您想要的行为所需的顺序打包它们

如果您将所有调用移动到父窗口小部件组织的组中的
pack
(即
main\u应用程序的所有子应用程序都打包在一起),则如下所示。通过将
text\u editor
放在最后,这可以确保在窗口填满之前所有其他小部件都可见,并且
pack
将在没有空间时开始缩小文本小部件的请求大小

tool_bar.pack(side=tk.TOP,fill=tk.X)
status_bar.pack(side=tk.BOTTOM,fill=tk.X)
yscroll_bar.pack(side=tk.RIGHT,fill=tk.Y)
text_editor.pack(fill=tk.BOTH,expand=True)

谢谢。。。我还想问
grid
在这方面是否与
pack
的行为相同?