При изменении размера шрифта текстовый виджет будет увеличиваться, поскольку высота указывается в количестве строк, а размер шрифта изменяет высоту строки.
Когда на самом деле 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)