底部的标签随着文本编辑器字体大小的增加而消失

Label at the bottom disappears on increasing font size of text editor

我正在用 tkinter 做一个文本编辑器。我注意到当我将字体大小增加到超过 16 时,状态栏(底部的标签)会自行消失并在我将大小减小到小于 17 时重新出现。 下面是我的代码的最小可行示例。 我认为这是因为文本编辑器在字体大小增加时需要更多 space 但它仍然不应该在任何情况下删除状态栏。 他们有任何修复或它是怎样的吗?

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()

当您更改字体大小时,它会导致文本小部件变大,因为高度是在行数中给出的,而字体大小会改变行高。

pack 实际向 window 添加小部件时,一旦 window 不能再增长并且无法缩小当前小部件,它将停止添加小部件他们的选择和要求的尺寸。因此,随着文本小部件的增长和增长,最终它会填满 window。一旦 window 已满,pack 将停止向 window 添加小部件。

这是关于打包算法的规范 tcl/tk 文档必须说的(强调由我添加):

If the cavity should become too small to meet the needs of a slave then the slave will be given whatever space is left in the cavity. If the cavity shrinks to zero size, then all remaining slaves on the packing list will be unmapped from the screen until the master window becomes large enough to hold them again.

换句话说,它优先于先打包的小部件而不是后打包的小部件。

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

这是为什么将一组儿童的所有 pack 命令放在一起而不是将它们散布在整个代码中的一个很好的理由。您可以按照您认为合理的顺序创建小部件,然后按照您想要的行为所需的顺序打包它们。

如果您将所有调用移至 pack 中由父小部件组织的组中(即:main_application 的所有子项打包在一起),它将如下所示。通过将 text_editor 放在最后,可以确保在 window 填满之前所有其他小部件都可见,并且 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)