Как сохранить размеры фреймов, когда виджеты размещаются внутри фреймов? - PullRequest
0 голосов
/ 16 мая 2019

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

import tkinter as tk
def main():
    main_win = tk.Tk()
    main_win.title('just playing around')
    main_win.geometry('350x450')

    main_win.rowconfigure(0, weight=1)
    main_win.rowconfigure(1, weight=1)
    main_win.columnconfigure(0, weight=1)
    main_win.columnconfigure(1, weight=1)
    main_win.columnconfigure(2, weight=1)

    frm1 = tk.Frame(main_win, bg='red', height=100, width=350)

    frm1.grid(row=0, sticky='nsew')
    frm1.rowconfigure(0, weight=1)
    frm1.rowconfigure(1, weight=1)
    frm1.rowconfigure(2, weight=1)
    frm1.columnconfigure(0, weight=1)

    frm2 = tk.Frame(main_win, bg='green', height=150, width=350)
    frm2.grid(row=1, sticky='nsew')
    frm2.rowconfigure(0, weight=1)
    frm2.rowconfigure(1, weight=1)
    frm2.rowconfigure(2, weight=1)
    frm2.columnconfigure(0, weight=1)

    quit_btn = tk.Button(frm1, bg='lightgrey', text='Quit',
                         command=main_win.destroy)
    quit_btn.grid(row=1)

    main_win.mainloop()

    return 0

if __name__ == '__main__':
    main()

Почему это происходит, и что нужно для того, чтобы кадры были одинакового размера?

(Кроме того, изменение размера окна приводит к изменению размера кадров по вертикали, но не по горизонтали. Почему это происходит и как я могу изменить размер в обоих направлениях (или отключить его в обоих направлениях)?)

1 Ответ

1 голос
/ 16 мая 2019

Так как tkinter по умолчанию заставит фрейм изменить размер виджетов, даже если вы дадите ему размер, как только вы поместите виджет в фрейм, он изменит размер на виджет.Вместо этого нам нужно указать tkinter, чтобы он не разрешал распространение.Поэтому, если мы отключим распространение внутри фрейма, в котором находится кнопка, он больше не будет изменять размер, чтобы соответствовать кнопке.

В случае проблемы с расширением вправо при изменении размера это связано с весами в столбце 1.и 2. Если вы не планируете добавлять что-либо в эти столбцы, вам необходимо удалить весовые коэффициенты для этих столбцов.

Поскольку вы добавляете вес для всех 3 столбцов, размер столбцов в контейнере будет изменяться с одинаковой скоростью.В этом случае, поскольку столбцы 1 и 2 начинаются с нулевого размера, когда вы начинаете изменять размер окна, вы заметите, что столбец 0 изменяет размеры, но недостаточно быстро, чтобы заполнить окно.Это связано с тем, что столбцы 1 и 2 также растут с той же скоростью, что и столбец 0, из-за устанавливаемых весов.

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

Попробуйте этот код и дайте мне знать, если у вас есть какие-либо вопросы.

import tkinter as tk


def main():
    main_win = tk.Tk()
    main_win.title('just playing around')
    main_win.geometry('350x450')

    # main_win.rowconfigure(0, weight=1) # disable this
    main_win.rowconfigure(1, weight=1)
    main_win.columnconfigure(0, weight=1)
    # main_win.columnconfigure(1, weight=1) # disable this
    # main_win.columnconfigure(2, weight=1) # disable this

    frm1 = tk.Frame(main_win, bg='red', height=100, width=350)
    frm1.grid(row=0, column=0, sticky='nsew')

    frm1.grid_propagate(False) # add grid_propagate(False) after your grid placement.

    frm1.rowconfigure(0, weight=1)
    frm1.rowconfigure(1, weight=1)
    frm1.rowconfigure(2, weight=1)
    frm1.columnconfigure(0, weight=1)

    frm2 = tk.Frame(main_win, bg='green', height=150, width=350)
    frm2.grid(row=1, column=0, sticky='nsew')
    frm2.rowconfigure(0, weight=1)
    frm2.rowconfigure(1, weight=1)
    frm2.rowconfigure(2, weight=1)
    frm2.columnconfigure(0, weight=1)

    quit_btn = tk.Button(frm1, bg='lightgrey', text='Quit', command=main_win.destroy)
    quit_btn.grid(row=1)
    main_win.mainloop()


if __name__ == '__main__':
    main()

Результаты:

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...