Менеджер геометрии сетки Tkinter Grid в Python с примерами

Менеджер геометрии Tkinter Grid размещает виджет в окне.

Содержание

Что такое менеджер геометрии сетки Tkinter Grid?

Менеджер геометрии сетки Tkinter Grid в Python использует концепции строк и столбцов для упорядочивания виджетов.

Ниже показана сетка, состоящая из четырех строк и трех столбцов:

Пример сетки из 4 строк и 3 столбцов

Каждая строка и столбец в сетке идентифицируются индексом. По умолчанию первая строка имеет индекс ноль, вторая строка имеет индекс один и т. д. Аналогично, столбцы в сетке имеют индексы ноль, один, два и т. д.

Индексы строк и столбцов в сетке не обязательно должны начинаться с нуля. Кроме того, индексы строк и столбцов могут иметь пробелы.

Например, у вас может быть сетка, индексы столбцов которой равны 1, 2, 10, 11 и 12. Это полезно, если вы планируете позже добавить больше виджетов в середину сетки.

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

Чтобы разместить несколько виджетов в ячейке, используйте Frame или LabelFrame, чтобы обернуть виджеты и поместить Frame или LabelFrame в ячейку.

Ширина столбца зависит от ширины виджета, который он содержит. Аналогично, высота строки зависит от высоты виджетов, содержащихся в строке.

Строки и столбцы могут объединяться. Ниже показана сетка, имеющая ячейку(1,1), охватывающую два столбца, и ячейку(0,2), охватывающую две строки:

Пример объединения ячеек в сетке

Настройка сетки

Перед размещением виджетов в сетке вам необходимо настроить строки и столбцы сетки.

Tkinter предоставляет два метода настройки строк и столбцов сетки:

container.columnconfigure(index, weight)
container.rowconfigure(index, weight)

Метод columnconfigure() настраивает index столбца сетки.

weight определяет, какую ширину займет столбец по отношению к другим столбцам. Например, столбец с weight 2 будет в два раза шире столбца с весом 1.

Размещение виджета в сетке

Чтобы разместить виджет в сетке, используйте метод виджета grid():

widget.grid(**options)

Метод grid() имеет следующие параметры:

Параметры Значение
column Индекс столбца, в котором вы хотите разместить виджет.
row Индекс строки, в которую вы хотите поместить виджет.
rowspan Установите количество смежных строк, которые может охватывать виджет.
columnspan Установите количество смежных столбцов, которые может охватывать виджет.
sticky Если ячейка больше виджета, параметр «sticky» указывает, к какой стороне виджет должен прикрепляться и как распределять дополнительное пространство внутри ячейки, которое не занято виджетом при его исходном размере.
padx Добавьте внешние отступы над и под виджетом.
pady Добавьте внешние отступы слева и справа от виджета.
ipadx Внутренние отступы внутри виджета с левой и правой сторон.
ipady Внутренние отступы внутри виджета сверху и снизу.

Sticky

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

Размещение виджета в центре ячейки по умолчанию

Чтобы изменить это поведение по умолчанию, можно использовать параметр sticky. Параметр sticky указывает, к какому краю ячейки должен прилипать виджет.

Значение sticky имеет следующие допустимые значения:

Липкий Описание
N Север или по центру сверху
S Юг или по центру снизу
E Восток или по центру справа
W Запад или по центру слева
NW Северо-запад или верхний левый угол
NE Северо-восток или верхний правый угол
SE Юго-Восток или нижний правый угол
SW Юго-запад или нижний левый угол
NS NS растягивает виджет по вертикали. Однако по горизонтали виджет остается центрированным.
EW EW растягивает виджет по горизонтали. Однако по вертикали он остается центрированным.

Если вы хотите разместить виджет в углу ячейки, вы можете использовать клавиши N, S, E и W.

В следующем примере показано, как расположить виджет, если параметр sticky установлен на N:

Пример расположения виджета при значении sticky N

Если вы хотите расположить виджет по центру одной из сторон ячейки, вы можете использовать NW(вверху слева), NE(вверху справа), SE(внизу справа) и SW(внизу слева).

В следующем примере показано, как расположить виджет с параметром N, установленным на NW:

Сетка Tkinter - Sticky NW

NS растягивает виджет по вертикали. Однако он оставляет виджет центрированным по горизонтали:

Пример расположения виджета при значении sticky NS

EW растягивает виджет по горизонтали. Однако он оставляет виджет центрированным по вертикали:

Расположение виджета при значении sticky EW

Отступ

Для добавления отступов между ячейками сетки используйте параметры padx и pady. Padx и pady — это внешние отступы:

grid(column, row, sticky, padx, pady)

Чтобы добавить отступы в сам виджет, используйте параметры ipadx и ipady. Ipadx и ipady — это внутренние отступы:

grid(column, row, sticky, padx, pady, ipadx, ipady)

Внутренние и внешние отступы по умолчанию равны нулю.

Пример Tkinter grid

В этом примере мы воспользуемся менеджером геометрии сетки для разработки экрана входа в систему следующим образом:

Разработка экрана входа

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

Сетка с двумя столбцами и тремя строками

Ниже показано полное окно входа в систему:

import tkinter as tk
from tkinter import ttk

# root window
root = tk.Tk()
root.geometry("240x100")
root.title('Login')
root.resizable(0, 0)

# configure the grid
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=3)


# username
username_label = ttk.Label(root, text="Username:")
username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

username_entry = ttk.Entry(root)
username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5)

# password
password_label = ttk.Label(root, text="Password:")
password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

password_entry = ttk.Entry(root,  show="*")
password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)

# login button
login_button = ttk.Button(root, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)


root.mainloop()

Как это работает.

  • Сначала используйте метод columnconfigure(), чтобы задать вес первого и второго столбцов сетки. Ширина второго столбца в три раза больше ширины первого столбца.
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=3)
  • Во-вторых, поместите метку имени пользователя в первый столбец, а запись имени пользователя — во второй столбец первой строки сетки:
username_label = ttk.Label(root, text="Username:")
username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

username_entry = ttk.Entry(root, textvariable=username)
username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5
  • В-третьих, разместите метку пароля и запись в первом и втором столбцах второй строки:
password_label = ttk.Label(root, text="Password:")
password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

password_entry = ttk.Entry(root, textvariable=password, show="*")
password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)
  • Наконец, разместите кнопку входа в третью строку. Поскольку ее параметр sticky установлен на E, кнопка выравнивается по правому краю третьей строки.
login_button = ttk.Button(root, text="Login")
login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)

Ниже показана та же программа. Однако вместо этого она использует объектно-ориентированное программирование:

import tkinter as tk
from tkinter import ttk


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry("240x100")
        self.title('Login')
        self.resizable(0, 0)

        # configure the grid
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=3)

        self.create_widgets()

    def create_widgets(self):
        # username
        username_label = ttk.Label(self, text="Username:")
        username_label.grid(column=0, row=0, sticky=tk.W, padx=5, pady=5)

        username_entry = ttk.Entry(self)
        username_entry.grid(column=1, row=0, sticky=tk.E, padx=5, pady=5)

        # password
        password_label = ttk.Label(self, text="Password:")
        password_label.grid(column=0, row=1, sticky=tk.W, padx=5, pady=5)

        password_entry = ttk.Entry(self,  show="*")
        password_entry.grid(column=1, row=1, sticky=tk.E, padx=5, pady=5)

        # login button
        login_button = ttk.Button(self, text="Login")
        login_button.grid(column=1, row=3, sticky=tk.E, padx=5, pady=5)


if __name__ == "__main__":
    app = App()
    app.mainloop()
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *