Метод сетки для правильного позиционирования кадров - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь использовать метод grid (), чтобы расположить два кадра - один в верхней части окна, а другой в левой части окна.

Мне это удалось с помощью метода pack () - это дает мне то, что я хочу:

It looks fine with the pack method

Это работает с методом pack (), который прекрасно работает:

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

frame_top.pack(side=tk.TOP, fill=tk.X)
frame_left.pack(side=tk.LEFT, fill=tk.Y)


main_window.mainloop()

Однако я пытаюсь узнать больше о методе grid, поэтому, когда я пытаюсь сделать то же самое с помощью метода grid (), он выглядит примерно так:

does not look right when I use the grid method

Мой код с методом grid () (здесь что-то не так):

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

frame_top.grid(row=0, column=0, sticky=tk.W+tk.N+tk.E)
frame_left.grid(row=1, column=0, sticky=tk.W+tk.S+tk.N)


main_window.mainloop()

Что я делаю не так с методом grid ? Как сделать так, чтобы он выглядел так же, как при использовании pack ()?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

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

Вы можете указать сетке, что делать с дополнительным пространством, задав «вес» для строк и столбцов. Вес говорит сетке, как выделить дополнительное пространство. Хорошее практическое правило заключается в том, что вы всегда должны указывать хотя бы одну строку и один столбец для каждого виджета, который использует grid для управления своими дочерними элементами.

В вашем конкретном случае c добавьте следующее код будет выглядеть так же, как тот, в котором вы используете pack:

main_window.grid_rowconfigure(1, weight=1)
main_window.grid_columnconfigure(0, weight=1)

Это говорит grid, что любое дополнительное вертикальное пространство должно быть задано в строке 1, а любое дополнительное горизонтальное пространство должно go в столбец 0

Однако , это просто быстрый взлом для иллюстрации. Я предполагаю, что вы захотите поместить другие виджеты в большое пустое пространство. Если это так, я думаю, что лучшим решением было бы придать весь вес строке 1 и столбцу 1. Затем убедитесь, что желтой рамке написано, что она охватывает два столбца. Я также рекомендую почти всегда, чтобы виджеты были «липкими» со всех сторон. В противном случае вы можете получить пробел, который вам не нужен.

frame_top.grid(row=0, column=0, sticky="nsew", columnspan=2)
frame_left.grid(row=1, column=0, sticky="nsew")

main_window.grid_rowconfigure(1, weight=1)
main_window.grid_columnconfigure(1, weight=1)

Следующим шагом будет размещение фрейма в строке 1, столбце 1. Затем вы можете добавить виджеты в этот фрейм, не затрагивая основной макет - внутри фрейма вы можете использовать pack или grid и этот макет будет независим от макета в окне в целом.

1 голос
/ 01 апреля 2020

Только использование .grid() не может сделать это напрямую. Вам необходимо установить rowspan и columnspan (если вы хотите, чтобы он всегда был заполнен одной строкой или одним столбцом). И установите columnconfigure и rowconfigure, чтобы сделать его отзывчивым. Это немного сложно.

import tkinter as tk

main_window = tk.Tk()
main_window.geometry("480x420")

frame_top = tk.Frame(main_window, bg="yellow", height=50)
frame_left = tk.Frame(main_window, bg="orange", width=50)

# always full one row
frame_top.grid(row=0, column=0, columnspan=999, sticky=tk.W+tk.N+tk.E)
# always full one column
frame_left.grid(row=1, column=0, rowspan=999, sticky=tk.W+tk.S+tk.N)

# make it responsive
main_window.grid_rowconfigure(0,weight=0)
main_window.grid_rowconfigure(1,weight=1)
main_window.grid_columnconfigure(0,weight=0)
main_window.grid_columnconfigure(1,weight=1)

main_window.mainloop()

Теперь это: enter image description here

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