Насколько я понимаю, после инициализации всех фреймов и виджетов в методе __init__
, окно tkinter изменяет размер, чтобы вместить все эти компоненты.
Я хотел бы установить инициализированный размер окна как его минимальный размер. Я хочу иметь возможность максимизировать и масштабировать окно, но я никогда не хочу, чтобы окно было настолько маленьким, чтобы начать скрывать виджеты.
Как мне этого добиться?
Вы также можете принудительно выполнить обновление сразу, не входя в mainloop, используя что-то вроде этого:
root = Tk()
# set up widgets here, do your grid/pack/place
# root.geometry() will return '1x1+0+0' here
root.update()
# now root.geometry() returns valid size/placement
root.minsize(root.winfo_width(), root.winfo_height())
Описание update() в effbot tkinterbook:
Обрабатывает все ожидающие события, вызывает обратные вызовы событий, завершает любое ожидающее управление геометрией, перерисовывает виджеты по мере необходимости, и вызывает все незавершенные задачи. Этот метод следует использовать с осторожностью, так как он может привести к действительно неприятным условиям гонки, если его вызвать из неправильного > места (изнутри). месте (например, из обратного вызова события или из функции. которая может каким-либо образом быть вызвана из обратного вызова события, и т.д.). В случае сомнениях, используйте update_idletasks вместо этого.
Я часто использовал это, когда пытался понять, как сделать такие вещи, как получение размера/положения виджетов перед тем, как перейти в основной цикл.
Я понял это:
def __init__(self, master):
...
self.master.update_idletasks()
self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))
root = Tk()
С момента создания корневого окна. Корневое окно - это главное окно приложения в наших программах. Оно имеет строку заголовка и границы. Они предоставляются оконным менеджером. Оно должно быть создано до появления других виджетов.
root.geometry("250x150+300+300")
Метод geometry() задает размер окна и позиционирует его на экране. Первые два параметра - это ширина и высота окна. Последние два параметра - экранные координаты x, y.
app = Example(root)
Здесь мы создаем экземпляр класса приложения.
root.mainloop()
Наконец, мы входим в основной цикл. С этого момента начинается обработка событий. Основной цикл получает события от оконной системы и рассылает их виджетам приложения. Он завершается, когда мы нажимаем на кнопку закрытия панели заголовка или вызываем метод quit().
Надеюсь, вы нашли это полезным.