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

Я понимаю, что после инициализации всех фреймов и виджетов в методе __init__ окно tkinter изменяет размер для всех этих компонентов.

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

Как это сделать?

Ответы

Ответ 1

Вы также можете принудительно обновить обновление без ввода вашего 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.

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

Ответ 2

Я знаю, что этот вопрос старый, но здесь другой способ:

root = Tk()
root.minsize(foo, bar)

root.minsize() устанавливает минимальный размер окна в foo и bar, где foo и bar - это ширина и высота окна соответственно.

Ваш должен, однако, поместить этот код перед вашим mainloop.

Ответ 3

Я понял:

def __init__(self, master):
    ...
    self.master.update_idletasks()
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))

Ответ 4

root = Tk()

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

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

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

app = Example(root)

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

root.mainloop()  

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

enter image description here

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