Языки программирования

Библиотека Tkinter: Упаковщики

Упаковщик (менеджер геометрии, менеджер расположения) это специальный механизм, который размещает (упаковывает) виджеты на окне. В Tkinter есть три упаковщика: pack, place, grid.
В одном виджете можно использовать только один тип упаковки, при смешивании разных типов упаковки программа, скорее всего, не будет работать.

pack()

Упаковщик pack() является самым интеллектуальным (и самым непредсказуемым). При использовании этого упаковщика с помощью свойства side нужно указать к какой стороне родительского виджета он должен примыкать.
Как правило этот упаковщик используют для размещения виджетов друг за другом (слева направо или сверху вниз). Пример:
from tkinter import *

root = Tk()
root.title("Упаковщики")
root.minsize(width=500, height=400)

button1 = Button(text="1")
button2 = Button(text="2")
button3 = Button(text="3")
button4 = Button(text="4")
button5 = Button(text="5")
button1.pack(side='left')
button2.pack(side='top')
button3.pack(side='left')
button4.pack(side='bottom')
button5.pack(side='right')
root.mainloop()
Будет выведено:
Для создания сложной структуры с использованием этого упаковщика обычно используют Frame, вложенные друг в друга. При применении этого упаковщика можно указать следующие аргументы:
  • side («left»/»right»/»top»/»bottom») — к какой стороне должен примыкать размещаемый виджет;
  • fill (None/»x»/»y»/»both») — необходимо ли расширять пространство предоставляемое виджету;
  • expand (True/False) — необходимо ли расширять сам виджет, чтобы он занял всё предоставляемое ему пространство;
  • in_ — явное указание в какой родительский виджет должен быть помещён.
Кроме основной функции у виджетов есть дополнительные методы для работы с упаковщиками:
  • pack_configure — синоним для pack;
  • pack_slaves (синоним slaves) — возвращает список всех дочерних упакованных виджетов;
  • pack_info — возвращает информацию о конфигурации упаковки;
  • pack_propagate (синоним propagate) (True/False) — включает/отключает распространении информации о геометрии дочерних виджетов. По умолчанию виджет изменяет свой размер в соответствии с размером своих потомков. Этот метод может отключить такое поведение (pack_propagate(False));
  • pack_forget (синоним forget) — удаляет виджет и всю информацию о его расположении из упаковщика.

grid()

Этот упаковщик представляет собой таблицу с ячейками, в которые помещаются виджеты. Аргументы упаковщика:
  • row — номер строки, в который помещаем виджет;
  • rowspan — сколько строк занимает виджет;
  • column — номер столбца, в который помещаем виджет;
  • columnspan — сколько столбцов занимает виджет;
  • padx/pady — размер внешней границы (бордюра) по горизонтали и вертикали;
  • ipadx/ipady — размер внутренней границы (бордюра) по горизонтали и вертикали. Разница между pad и ipad в том, что при указании pad расширяется свободное пространство, а при ipad расширяется помещаемый виджет;
  • sticky («n», «s», «e», «w» или их комбинация) — указывает к какой границе «приклеивать» виджет. Позволяет расширять виджет в указанном направлении. Границы названы в соответствии со сторонами света. «n» (север) — верхняя граница, «s» (юг) — нижняя, «w» (запад) — левая, «e» (восток) — правая;
  • in_ — явное указание в какой родительский виджет должен быть помещён.
Пример: текстовый виджет с двумя полосами прокрутки:
from tkinter import *

root=Tk()
text = Text(wrap=NONE)
vscrollbar = Scrollbar(orient='vert', command=text.yview)
text['yscrollcommand'] = vscrollbar.set
hscrollbar = Scrollbar(orient='hor', command=text.xview)
text['xscrollcommand'] = hscrollbar.set

# размещаем виджеты
text.grid(row=0, column=0, sticky='nsew')
vscrollbar.grid(row=0, column=1, sticky='ns')
hscrollbar.grid(row=1, column=0, sticky='ew')

# конфигурируем упаковщик, чтобы текстовый виджет расширялся
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.mainloop()
Будет выведено:

place()

place представляет собой простой упаковщик, позволяющий размещать виджет в фиксированном месте с фиксированным размером.
Также он позволяет указывать координаты размещения в относительных единицах для реализации «резинового» размещения.
При использовании этого упаковщика, нам необходимо указывать координаты каждого виджета. Например:
button1.place(x=0,y=0)
Аргументы упаковщика:

  • anchor («n», «s», «e», «w», «ne», «nw», «se», «sw» или «center») — какой угол или сторона размещаемого виджета будет указана в аргументах x/y/relx/rely. По умолчанию «nw» — левый верхний;
  • bordermode («inside», «outside», «ignore») — определяет в какой степени будут учитываться границы при размещении виджета;
  • in_ — явное указание в какой родительский виджет должен быть помещён;
  • x и y — абсолютные координаты (в пикселях) размещения виджета;
  • width и height — абсолютные ширина и высота виджета;
  • relx и rely — относительные координаты (от 0.0 до 1.0) размещения виджета;
  • relwidth и relheight — относительные ширина и высота виджета.

Пример использования упаковщика place():
from tkinter import *
 
root = Tk()
root.geometry('300x300')
 
Button(bg='red').place(x=75, y=20)
Button(bg='green').place(relx=0.3, rely=0.5)
 
root.mainloop()
Будет выведено:
Еще один пример использования упаковщика place():
from tkinter import *
 
root = Tk()
root.geometry('300x300')

Label(bg='white').place(x=10, y=10, 
                    width=50, height=30)
Label(bg='green').place(x=10, y=50, 
                    relwidth=0.3, relheight=0.15)
 
root.mainloop()
Будет выведено:
Видео по уроку:
Библиотека Tkinter