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

问题描述 投票:1回答:1

我正在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 text-editor
1个回答
0
投票

当更改字体大小时,由于高度是根据行数指定的,并且字体大小会更改行高,这将导致文本小部件增大。

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

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

如果腔体变得太小而不能满足奴隶的需求,那么将给奴隶任何剩余的空间。 如果型腔缩小到零大小,则装箱单上所有剩余的从属设备将不会从屏幕上映射出去,直到主窗口变得足够大以再次容纳它们为止。

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

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

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

如果将所有呼叫移到由父窗口小部件组织的组中的所有pack上(即:main_application的所有子代都打包在一起),则如下所示。通过最后放置text_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)
© www.soinside.com 2019 - 2024. All rights reserved.