Как установить минимальный размер окна в tkinter?

Насколько я понимаю, после инициализации всех фреймов и виджетов в методе __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 вместо этого.

Я часто использовал это, когда пытался понять, как сделать такие вещи, как получение размера/положения виджетов перед тем, как перейти в основной цикл.

Комментарии (1)

Я понял это:

def __init__(self, master):
    ...
    self.master.update_idletasks()
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))
Комментарии (0)
root = Tk()

С момента создания корневого окна. Корневое окно - это главное окно приложения в наших программах. Оно имеет строку заголовка и границы. Они предоставляются оконным менеджером. Оно должно быть создано до появления других виджетов.

root.geometry("250x150+300+300")

Метод geometry() задает размер окна и позиционирует его на экране. Первые два параметра - это ширина и высота окна. Последние два параметра - экранные координаты x, y.

app = Example(root)

Здесь мы создаем экземпляр класса приложения.

root.mainloop()  

Наконец, мы входим в основной цикл. С этого момента начинается обработка событий. Основной цикл получает события от оконной системы и рассылает их виджетам приложения. Он завершается, когда мы нажимаем на кнопку закрытия панели заголовка или вызываем метод quit().

Надеюсь, вы нашли это полезным.

Комментарии (3)