grid()
и pack()
являются «точными», достаточными для большинства потребностей.Вам просто нужно научиться правильно использовать эти менеджеры геометрии в полной мере.На самом деле использование place()
- это почти никогда не то, что вам нужно.Он имеет свой случай использования, но это не лучший выбор для общих настроек графического интерфейса.Также очень сложно управлять обновлением вашего кода.
Обновление: чтобы ответить на ваш вопрос в комментариях:
Настройка строки означает, что вы помещаете каждую строку в 1 пиксель, потому чтовеса?Я знаю, что могу нарисовать сетку для всего этого, но я не знаю, сколько строк, столбцов в моей программе.поэтому я не могу найти центр.
Веса используются, чтобы сказать, что конкретная строка или столбец должны изменить размер в определенном соотношении по отношению к другим строкам и столбцам вокруг них в пределах той же сетки /контейнер.Вес по умолчанию равен нулю.Когда мы установим вес в 1, тогда размер строки или столбца изменится с окном с равномерной скоростью.
Возьмем пример кода:
import tkinter as tk
root=tk.Tk()
center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky="nsew")
tk.Label(center_frame, text="Name/ID").grid(row=0, column=0)
tk.Label(center_frame, text="Password").grid(row=1, column=0)
tk.Button(center_frame, text="Enter").grid(row=2, column=1)
root.mainloop()
Результаты:
![enter image description here](https://i.stack.imgur.com/6wV4B.png)
В приведенном выше примере вы увидите, что виджеты не перемещаются при изменении размера окна.Это потому, что мы не дали команду tkinter разрешить перемещение каких-либо строк или столбцов.
Если мы добавим этот вес в программу root.rowconfigure(0, weight=1)
:
Тогда мы получим этот эффект:
![enter image description here](https://i.stack.imgur.com/GXAxe.png)
Далее добавьте это root.rowconfigure(2, weight=1)
:
![enter image description here](https://i.stack.imgur.com/C5gtH.png)
Следующее добавьте это root.columnconfigure(0, weight=1)
:
![enter image description here](https://i.stack.imgur.com/ITGGK.png)
Далее добавьте root.columnconfigure(2, weight=1)
:
![enter image description here](https://i.stack.imgur.com/p57qK.png)
Как видно из приведенных изображений, в зависимости от того, для каких строк и столбцов вы установили вес, размер строк и столбцов изменится соответствующим образом.С помощью приведенного выше кода мы добьемся изменения размера строк 0 и 2 и изменения размеров столбцов 0 и 2.row 1 column 1
не изменит размер.Таким образом, это означает, что все, что мы помещаем в позицию row 1 column 1
, не будет изменять размеры, а будет сохранять свое относительное расположение к границам.Поскольку мы устанавливаем виджет фрейма в положение row 1 column 1
, а затем все наши виджеты внутри фрейма, мы фактически сделали row 1 column 1
центром.
Строк и столбцов столько, сколько вы скажете, чтобы они были,Tkinter автоматически отрегулирует общее количество строк и столбцов в зависимости от того, что вы говорите.Кроме того, он также сделает строки и столбцы, в которых ничего нет, нулевого размера.Это означает, что только строки и столбцы с содержимым (виджеты) будут фактически влиять на размер сетки.
Скажем, у нас есть 3 строки и 3 столбца.В зависимости от того, как мы его заполним, он изменит размер отображаемого текста.
В этом примере, где вы видите, X
показывает, что мы помещаем что-то в следующие строки и столбцы.
InВ этом примере у нас есть что-то в (0,0), (1,1) и (2,2).
ROW
0 1 2
*-------*-------*-------*
| | | |
0 | X | | |
C | | | |
O *-------*-------*-------*
L | | | |
U 1 | | X | |
M | | | |
N *-------*-------*-------*
| | | |
2 | | | X |
| | | |
*-------*-------*-------*
В этом примере у нас есть что-то в (0,0) и (2,2)).
0 2
*-------*-------*
| | |
0 | X | |
| | |
*-------*-------*
| | |
2 | | X |
| | |
*-------*-------*
В этом примере мы имеем что-то в (1,0), (2,1) и (2,2).
0 1 2
*-------*-------*-------*
| | | |
1 | X | | |
| | | |
*-------*-------*-------*
| | | |
2 | | X | X |
| | | |
*-------*-------*-------*
Приведенные выше примеры иллюстрируют то, что автоматическиотображается в зависимости от того, какую строку и сетку вы заполняете виджетами.
Что касается аргументов типа sticky
, то они используются для управления поведением каждого виджета.Например, если мы скажем виджету заполнить все пространство в заданной строке / столбце, мы будем использовать sticky="nsew"
.Если мы хотим, чтобы виджет растягивался в заданной строке / столбце по горизонтали, а не по вертикали, мы бы использовали sticky="ew"
для востока / запада.Имейте в виду, что липкий аргумент для grid()
.Менеджер геометрии pack()
имеет свои собственные аргументы.
Есть много опций, и вы можете найти их список здесь с их описаниями:
Для grid()
Для pack()
Возьмите приведенный ниже пример.Этот код будет постоянно устанавливать метки и центрирование окна в окне, даже когда вы изменяете размер окна.Это гораздо проще в управлении, чем место.
Есть много полезных аргументов, которые вы можете использовать в ваших менеджерах геометрии для достижения практически любого поведения или выравнивания, которое вы пожелаете.Просто найдите время, чтобы копаться в этом.Я знаю, что place()
кажется лучшим вариантом (я тоже так думал, когда впервые начал, пока Брайан не исправил это понятие: D), но на самом деле это не так.
import tkinter as tk
root=tk.Tk()
root.rowconfigure(0, weight=1)
root.rowconfigure(2, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(2, weight=1)
center_frame = tk.Frame(root)
center_frame.grid(row=1, column=1, sticky="nsew")
tk.Label(center_frame, text="Name/ID").grid(row=0, column=0)
tk.Label(center_frame, text="Password").grid(row=1, column=0)
tk.Button(center_frame, text="Enter").grid(row=2, column=1)
root.mainloop()
Вот пример использования pack()
,Я считаю, что grid()
- мой путь, но pack()
может быть использован и для достижения многих целей.
import tkinter as tk
root=tk.Tk()
center_frame = tk.Frame(root)
center_frame.pack(expand=True)
tk.Label(center_frame, text="Name/ID").pack(side=tk.TOP)
tk.Label(center_frame, text="Password").pack(side=tk.TOP)
tk.Button(center_frame, text="Enter").pack(side=tk.RIGHT)
root.mainloop()