Метка внизу исчезает при увеличении размера шрифта текстового редактора - PullRequest
1 голос
/ 04 апреля 2020

Я делаю текстовый редактор в 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()

1 Ответ

0 голосов
/ 04 апреля 2020

При изменении размера шрифта текстовый виджет будет увеличиваться, поскольку высота указывается в количестве строк, а размер шрифта изменяет высоту строки.

Когда на самом деле pack добавляет виджеты в окно, оно прекращает добавление виджетов, когда окно больше не может расти, и оно не может уменьшить текущие виджеты в зависимости от их параметров и запрошенного размера. Итак, когда текстовый виджет растет и растет, в конечном итоге он заполняет окно. Когда окно заполнено, pack прекращает добавление виджетов в окно.

Вот что говорит каноническая документация tcl / tk по алгоритму упаковки (с акцентом, добавленным мной):

Если полость станет слишком маленькой, чтобы удовлетворить потребности раба, то рабу будет предоставлено все пространство, оставшееся в полости. Если полость сжимается до нулевого размера, то все оставшиеся ведомые устройства в списке упаковки будут не отображаться на экране , пока главное окно не станет достаточно большим, чтобы снова их удерживать.

В другими словами, он отдает приоритет виджету, упакованному ранее, над виджетами, упакованными позже.

Простое исправление заключается в упаковке строки состояния перед упаковкой текстового виджета. Таким образом, строка состояния уже будет на экране, поэтому при добавлении текстового виджета pack уменьшит его, чтобы он уместился.

Это хорошая причина, по которой целесообразно объединять все команды pack для группы детей, а не разбрасывать их по всему коду. Вы можете создавать виджеты в порядке, который, по вашему мнению, имеет смысл, но затем упаковать их в порядке, требуемом желаемым поведением.

Если вы переместите все свои вызовы на pack в группе, организованной родителем виджет (ie: все дочерние элементы main_application упакованы вместе), это будет выглядеть следующим образом. Помещая text_editor last, это гарантирует, что все остальные виджеты будут видны до того, как окно заполнится, и что 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)
...