Главная


Сделать корневое окно изменяемым по размеру

Хотите ли вы разрешить пользователю изменять размер всего окна вашего приложения и распределять лишнее пространство между его внутренними виджетами? Для этого требуются некоторые операции, которые не так очевидны.

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

Рассмотрим тривиальное приложение, которое содержит только кнопку Quit. Если вы запустите это приложение и измените размер окна, кнопка останется тем же размером и останется посередине окна.

Вот версия метода .createWidgets() в минимальном приложении. В этой версии кнопка Quit всегда занимает все доступное пространство.

def createWidgets(self):
    top = self.winfo_toplevel()        # №1
    top.rowconfigure(0, weight=1)      # №2
    top.columnconfigure(0, weight=1)   # №3
    self.rowconfigure(0, weight=1)     # №4
    self.columnconfigure(0, weight=1)  # №5
    self.quit = Button(self, text='Quit', command=self.quit)
    self.quit.grid(row=0, column=0,    # №6
        sticky=tk.N+tk.S+tk.E+tk.W)
Описание
1 «Верхнее окно» - это самое внешнее окно на экране. Однако это окно не является вашим окном Application - это родительский элемент экземпляра Application. Чтобы получить верхнее окно, вызовите метод .winfo_toplevel() на любом виджете вашего приложения.
2 Эта строка делает строку 0 сетки верхнего окна растяжимой.
3 Эта строка делает столбец 0 сетки верхнего окна растяжимым.
4 Делает строку 0 сетки виджета Application растяжимой.
5 Делает столбец 0 сетки виджета Application растяжимым.
6 Аргумент sticky=tk.N+tk.S+tk.E+tk.W заставляет кнопку расширяться, чтобы заполнить свою ячейку сетки.

Требуется еще одно изменение. В конструкторе измените вторую строку следующим образом:

def __init__(self, master=None):
    tk.Frame.__init__(self, master)
    self.grid(sticky=tk.N+tk.S+tk.E+tk.W)
    self.createWidgets()

Аргумент sticky=tk.N+tk.S+tk.E+tk.W для self.grid() необходим, чтобы виджет Application расширялся, чтобы заполнить свою ячейку сетки верхнего уровня окна.


>> Стандартные атрибуты