метод grid()

Grid є одним з трьох менеджерів геометрії в Tkinter (іншими є вже розглянутий раніше Pack, а також Place). У всіх віджетів є відповідний даному менеджеру метод grid. "Grid" з англійської перекладається як "сітка", однак за змістом правильніше говорити про таблиці.

Табличний спосіб розміщення кращий через його гнучкості і зручності, коли справа доходить до розробки щодо складних інтерфейсів. Grid дозволяє уникнути використання безлічі фреймів, що неминуче в разі пакувальника Pack.

При розміщенні віджетів методом gridбатьківський контейнер (зазвичай це вікно) умовно поділяється на осередки подібно таблиці. Адреса кожного осередку складається з номера рядка і номера стовпчика. Нумерація починається з нуля. Осередки можна об'єднувати як по вертикалі, так і по горизонталі.

Grid є одним з трьох менеджерів геометрії в Tkinter (іншими є вже розглянутий раніше Pack, а також Place). У всіх віджетів є відповідний даному менеджеру метод grid. "Grid" з англійської перекладається як "сітка", однак за змістом правильніше говорити про таблиці.

Табличний спосіб розміщення кращий через його гнучкості і зручності, коли справа доходить до розробки щодо складних інтерфейсів. Grid дозволяє уникнути використання безлічі фреймів, що неминуче в разі пакувальника Pack.

При розміщенні віджетів методом gridбатьківський контейнер (зазвичай це вікно) умовно поділяється на осередки подібно таблиці. Адреса кожного осередку складається з номера рядка і номера стовпчика. Нумерація починається з нуля. Осередки можна об'єднувати як по вертикалі, так і по горизонталі.


На малюнку пунктир позначає об'єднання осередків. Загальна осередок в такому випадку позначається адресою першої.

Ніяких попередніх команд по розподіленню батьківського віджета на осередки не виконується. Tkinter робить це сам, виходячи із зазначених позицій віджетів.

Розміщення віджета в тій чи іншій клітинці задається через аргументи rowі column, яким присвоюються відповідно номера рядка і стовпчика. Щоб об'єднати комірки по горизонталі, використовується атрибут columnspan, якому присвоюється кількість поєднуваних осередків. Опція rowspanоб'єднує осередки по вертикалі.

Нехай треба запрограмувати такий GUI:


Уявімо даний інтерфейс у вигляді таблиці і пронумеруємо осередки, в яких будуть розташовуватися віджети (подібну розбивку можна зробити в умі):


Тепер пишемо код:

from tkinter import *

root = Tk ( )

Label ( text = "Ім'я:" ) \

. grid ( row = 0 , column = 0 )

Entry ( width = 30 ) \

. grid ( row = 0 , column = 1 , columnspan = 3 )

Label ( text = "Стовпців:" ) \

. grid ( row = 1 , column = 0 )

Spinbox ( width = 7 , from_ = 1 , to = 50 ) \

. grid ( row = 1 , column = 1 )

Label ( text = "Строк:" ) \

. grid ( row = 1 , column = 2 )

Spinbox ( width = 7 , from_ = 1 , to = 100 ) \

. grid ( row = 1 , column = 3 )

Button ( text = "Довідка" ) . grid ( row = 2 , column = 0 )

Button ( text = "Вставити" ) . grid ( row = 2 , column = 2 )

Button ( text = "Скасувати" ) . grid ( row = 2 , column = 3 )

root. mainloop ( )

Примітка. У прикладі використовуються віджети класу Spinbox, які не розглядалися в курсі. Spinboxсхожий на Entry, але для нього задається список прийнятих значень, і є подібність скроллера.

Виконавши наведений вище програмний код, отримаємо:


Схоже, але не зовсім те, що хотілося. Тепер на допомогу повинні прийти інші властивості методу grid. У нього, також як у pack, є атрибути для завдання зовнішніх і внутрішніх відступів ( padx, pady, ipadx, ipady).

Крім цього є атрибут sticky(липкий), який приймає значення напрямків сторін світу (N, S, W, E, NW, NE, SW, SE). Якщо, наприклад, вказати NW, то віджет приб'є до верхнього лівого кута комірки. Віджети можна розтягувати на весь обсяг осередку ( sticky=N+S+W+E) або тільки по одній з осей ( N+Sабо W+E). Ефект від "липучки" помітний, тільки якщо віджет менше осередки.


from tkinter import *

root = Tk ( )

Label ( text = "Ім'я:" ).grid ( row = 0 , column = 0 , sticky = W , pady = 10 , padx = 10 )

table_name = Entry ( )

table_name.grid ( row = 0 , column = 1, columnspan = 3, sticky = W + E , padx = 10 )

Label ( text = "Стовпців:" ).grid ( row = 1 , column = 0 , sticky = W , padx = 10 , pady = 10 )

Spinbox ( width = 7 , from_ = 1 , to = 50 ).grid ( row = 1 , column = 1 , padx = 10 )

Label ( text = "Строк:" ).grid ( row = 1 , column = 2 , sticky = E )

Spinbox ( width = 7 , from_ = 1 , to = 100 ).grid ( row = 1 , column = 3 , sticky = E , padx = 10 )

Button ( text = "Довідка" ).grid ( row = 2 , column = 0 , pady = 10 , padx = 10 )

Button ( text = "Вставити" ).grid ( row = 2 , column = 2 )

Button ( text = "Скасувати" ).grid ( row = 2 , column = 3 , padx = 10 )

root. mainloop ( )


За допомогою методів grid_removeі grid_forgetможна зробити віджет невидимим. Відмінність між цими методами лише в тому, що grid_removeзапам'ятовує попереднє положення віджету. Тому для його відображення в колишньої осередки досить застосувати gridбез аргументів. Після grid_forgetпотрібно заново конфігурувати положення віджету.

from tkinter import *

def rem ( ) :

global l1_flag

if l1_flag == 1 :

l1. grid_remove ( )

l1_flag = 0

else :

l1. grid ( )

l1_flag = 1

def forg ( ) :

global l2_flag

if l2_flag == 1 :

l2. grid_forget ( )

l2_flag = 0

else :

l2. grid ( row = 1 )

l2_flag = 1

root = Tk ( )

l1_flag = 1

l2_flag = 1

l1 = Label ( width = 5 , height = 3 , bg = 'blue' )

l2 = Label ( width = 5 , height = 3 , bg = 'green' )

b1 = Button ( bg = 'lightblue' , command = rem)

B2 = Button ( bg = 'lightgreen' , command = forg )

l1. grid ( row = 0 )

l2. grid ( row = 1 )

b1. grid ( row = 2 )

b2. grid ( row = 3 )

root. mainloop ( )

У даній програмі блакитна мітка після видалення буде з'являтися в тому ж місці, де була до цього, не дивлячись на те, що у функції rem до неї застосовується метод gridбез налаштувань. На відміну від неї зелена мітка, якщо їй не вказати місце розміщення після видалення, з'являлася б під кнопками.

Приховування віджетів буває необхідно в тих випадках, коли, наприклад, від вибору користувача в одній частині інтерфейсу залежить, які віджети з'являться в інший.

Практична робота

Перепрограмуйте друге вікно з практичної роботи попереднього уроку, використовуючи метод grid.


На малюнку пунктир позначає об'єднання осередків. Загальна осередок в такому випадку позначається адресою першої.

Ніяких попередніх команд по розподіленню батьківського віджета на осередки не виконується. Tkinter робить це сам, виходячи із зазначених позицій віджетів.

Розміщення віджета в тій чи іншій клітинці задається через аргументи rowі column, яким присвоюються відповідно номера рядка і стовпчика. Щоб об'єднати комірки по горизонталі, використовується атрибут columnspan, якому присвоюється кількість поєднуваних осередків. Опція rowspanоб'єднує осередки по вертикалі.

Нехай треба запрограмувати такий GUI:


Уявімо даний інтерфейс у вигляді таблиці і пронумеруємо осередки, в яких будуть розташовуватися віджети (подібну розбивку можна зробити в умі):


Тепер пишемо код:


from tkinter import *

root = Tk ( )

Label ( text = "Ім'я:" ).grid ( row = 0 , column = 0 )

Entry ( width = 30 ).grid ( row = 0 , column = 1 , columnspan = 3 )

Label ( text = "Стовпців:" ).grid ( row = 1 , column = 0 )

Spinbox ( width = 7 , from_ = 1 , to = 50 ).grid ( row = 1 , column = 1 )

Label ( text = "Строк:" ).grid ( row = 1 , column = 2 )

Spinbox ( width = 7 , from_ = 1 , to = 100 ).grid ( row = 1 , column = 3 )

Button ( text = "Довідка" ) . grid ( row = 2 , column = 0 )

Button ( text = "Вставити" ) . grid ( row = 2 , column = 2 )

Button ( text = "Скасувати" ) . grid ( row = 2 , column = 3 )

root. mainloop ( )


Примітка. У прикладі використовуються віджети класу Spinbox, які не розглядалися в курсі. Spinboxсхожий на Entry, але для нього задається список прийнятих значень, і є подібність скроллера.

Виконавши наведений вище програмний код, отримаємо:


Схоже, але не зовсім те, що хотілося. Тепер на допомогу повинні прийти інші властивості методу grid. У нього, також як у pack, є атрибути для завдання зовнішніх і внутрішніх відступів ( padx, pady, ipadx, ipady).

Крім цього є атрибут sticky(липкий), який приймає значення напрямків сторін світу (N, S, W, E, NW, NE, SW, SE). Якщо, наприклад, вказати NW, то віджет приб'є до верхнього лівого кута комірки. Віджети можна розтягувати на весь обсяг осередку ( sticky=N+S+W+E) або тільки по одній з осей ( N+Sабо W+E). Ефект від "липучки" помітний, тільки якщо віджет менше осередки.


from tkinter import *

root = Tk ( )

Label ( text = "Ім'я:" ) . grid ( row = 0 , column = 0, sticky = W, pady = 10 , padx = 10 )

table_name = Entry ( )

table_name. grid ( row = 0 , column = 1, columnspan = 3, sticky = W + E , padx = 10 )

Label ( text = "Стовпців:" ).grid ( row = 1 , column = 0 , sticky = W, padx = 10 , pady = 10 )

Spinbox ( width = 7 , from_ = 1 , to = 50 ).grid ( row = 1 , column = 1 , padx = 10 )

Label ( text = "Строк:" ).grid ( row = 1 , column = 2 , sticky = E )

Spinbox ( width = 7 , from_ = 1 , to = 100 ).grid ( row = 1 , column = 3 , sticky = E , padx = 10 )

Button ( text = "Довідка" ).grid ( row = 2 , column = 0 , pady = 10 , padx = 10 )

Button ( text = "Вставити" ).grid ( row = 2 , column = 2 )

Button ( text = "Скасувати" ).grid ( row = 2 , column = 3 , padx = 10 )

root. mainloop ( )


За допомогою методів grid_removeі grid_forgetможна зробити віджет невидимим. Відмінність між цими методами лише в тому, що grid_removeзапам'ятовує попереднє положення віджету. Тому для його відображення в колишньої осередки досить застосувати gridбез аргументів. Після grid_forgetпотрібно заново конфігурувати положення віджету.


from tkinter import *

def rem ( ) :

global l1_flag

if l1_flag == 1 :

l1. grid_remove ( )

l1_flag = 0

else :

l1. grid ( )

l1_flag = 1

def forg ( ) :

global l2_flag

if l2_flag == 1 :

l2. grid_forget ( )

l2_flag = 0

else :

l2. grid ( row = 1 )

l2_flag = 1

root = Tk ( )

l1_flag = 1

l2_flag = 1

l1 = Label ( width = 5 , height = 3 , bg = 'blue' )

l2 = Label ( width = 5 , height = 3 , bg = 'green' )

b1 = Button ( bg = 'lightblue' , command = rem)

B2 = Button ( bg = 'lightgreen' , command = forg )

l1. grid ( row = 0 )

l2. grid ( row = 1 )

b1. grid ( row = 2 )

b2. grid ( row = 3 )

root. mainloop ( )

У даній програмі блакитна мітка після видалення буде з'являтися в тому ж місці, де була до цього, не дивлячись на те, що у функції rem до неї застосовується метод gridбез налаштувань. На відміну від неї зелена мітка, якщо їй не вказати місце розміщення після видалення, з'являлася б під кнопками.

Приховування віджетів буває необхідно в тих випадках, коли, наприклад, від вибору користувача в одній частині інтерфейсу залежить, які віджети з'являться в інший.

Практична робота

Перепрограмуйте друге вікно з практичної роботи попереднього уроку, використовуючи метод grid.