Метод grid() - сетка

Метод grid() применяет другой подход к позиционированию элементов, нежели метод place(), позволяя поместить элемент в определенную ячейку условной сетки или грида.

Grid() не растягивает виждеты, находящиеся в нем, а всегда занимает минимально необходимое пространство, необходимое для виджета.

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

  • column: номер столбца, отсчет начинается с нуля
  • row: номер строки (ряда), отсчет начинается с нуля
  • columnspan: сколько столбцов должен занимать элемент
  • rowspan: сколько строк (рядов) должен занимать элемент
  • ipadx и ipady: отступы по горизонтали и вертикали соответственно от границ элемента до его текста
  • padx и pady: отступы по горизонтали и вертикали соответственно от границ ячейки грида до границ элемента
  • sticky: выравнивание элемента в ячейке, если ячейка больше элемента. Может принимать значения: N, E, S, W, NE, NW, SE, SW, NSEW - они указывают соответствующее направление выравнивания

Начальный пример демонстрации позиционирования с помощью сетки:

from tkinter import *

root = Tk()
root.title("Welcome to grid app!")
root.geometry('350x200')
label = Label(root, text="Hello!")
label.grid(column=0, row=0)
button = Button(root, text="Click Me!")
button.grid(column=1, row=0)
root.mainloop()
1
2
3
4
5
6
7
8
9
10

Результат выполнения:

01_grid

Следующий пример позволяет понять, как расположить элементы на сетке в виде шахматной доски:

from tkinter import *

root = Tk()
root.title("Welcome to grid app!")
label = Label(root, text="Hello!")
label.grid(column=1, row=0)
button_1 = Button(root, text="Left")
button_1.grid(column=0, row=0)
button_2 = Button(root, text="Right")
button_2.grid(column=2, row=0)
button_3 = Button(root, text="Bottom")
button_3.grid(column=1, row=1)
root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13

Результат выполнения:

02_grid

Пример окна для ввода логина и пароля:

from tkinter import *

root = Tk()
root.title("Welcome to the second entry app")

label_login = Label(root, text="Login")
label_login.grid(column=0, row=0, sticky=E)
field_login = Entry(root, width=10)
field_login.grid(column=1, row=0)

label_pass = Label(root, text="Password")
label_pass.grid(column=0, row=1, sticky=E)
field_pass = Entry(root, width=10)
field_pass.grid(column=1, row=1)

button = Button(root, text="Enter")
button.grid(column=0, row=2, columnspan=2, sticky=NSEW)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Результат выполнения:

03_grid

Упражнения

  1. Для дальнейшего переиспользования кода, создайте новый файл с названием app_calculator_fields_grid.py. Используя метод grid() напишите программу состоящую из:

    • однострочного текстового поля,
    • метки с отображением знака "+",
    • второго однострочного текстового поля,
    • кнопкой "=", при нажатии на которую результат вычисления выводиться в третье текстовое поле,
    • третьего однострочного тестового поля.

    grid_example_01

    • Добавьте в программу примеры со знаками: "-", "*", "**", "/", "//", "%". Реализуйте решения этих примеров.

    grid_example_02

    • Добавьте проверку деления на 0. С выводом сообщения об ошибке, в удобное для пользователя место. Консольный вывод сообщения об ошибке исключить.
  2. Для дальнейшего переиспользования кода, создайте новый файл с названием app_chessboard.py. Используя метод grid() создайте подобие шахматной доски размером 4 на 4, с обозначением полей: A, B, C, D верхняя горизонтальная строка и 8, 7, 6, 5 левый вертикальный столбик. Создание отдельных клеток реализуйте кнопками, разукрасив и подписав их соответственно.

    grid_chess_01

  3. Добавьте функции нажатия кнопок, при выполнении которых в консоль будут выводиться координаты нажатой кнопки: A1, B3 и т.д.

    • Добавить многострочное текстовое поле вдоль правого края доски.

    • Выводить в текстовое поле координаты нажатых кнопок: A1, B3 и т.д.

    grid_cheess_03

    • Реализуйте правильную расстановку запятых: если напечатано только одно значение, запятая не ставиться. Добавление следующих записей происходит через запятую.

    • Реализовать вставку текста, можно, воспользовавшись кодом:

    text = Text(root)
    text.insert(END, "Вставка текста в конец.")
    text.pack()
    print(text.get(1.0, END))
    
    1
    2
    3
    4