Шаг 14.
Библиотека Tkinter. Размещение компонентов в контейнерах. Диспетчеры компоновки. Pack: выстраивание компонентов вдоль сторон контейнера
На этом шаге мы рассмотрим назначение, его параметры и пример использования.
Диспетчер компоновки Pack - самый простой. Он выстраивает компоненты вдоль указанных сторон контейнера: левой, верхней, правой или нижней. Если вдоль одной и той же стороны
выстроено несколько компонентов, они разместятся друг за другом в направлении, соответственно, слева направо, сверху вниз, справа налево и снизу вверх.
Одно из преимуществ этого диспетчера компоновки - нам не нужно задавать размеры контейнера. Контейнер сам примет такие размеры, чтобы вместить все свое содержимое.
Вывод компонентов посредством диспетчера компоновки Pack выполняется вызовом метода pack([<Параметры>]), поддерживаемого всеми компонентами. Вот
параметры, которые мы можем использовать в этом методе:
- side - задает сторону контейнера, вдоль которой будет выстроен компонент. Указывается в виде строки:
- "left" (левая сторона),
- "top" (верхняя сторона - поведение по умолчанию),
- "right" (правая сторона) или
- "bottom" (нижняя сторона);
- after - указывает компонент, после которого должен располагаться текущий. Применяется, если требуется выстроить вдоль какой-либо стороны контейнера сразу несколько компонентов
в определенном порядке:
entName1.pack()
entAddrеss.pack()
entName2.pack(after=self.entName1)
В результате компоненты будут располагаться в контейнере в таком порядке (сверху вниз): entName1, entName2, entAddress;
- before - указывает компонент, перед которым должен располагаться текущий. Применяется, если требуется выстроить вдоль какой-либо стороны контейнера сразу несколько компонентов в определенном порядке:
btnOK.pack(side="bottom")
btnCancel.pack(side="bottom", before=self.btnOK)
В результате компоненты будут располагаться в контейнере в таком порядке (сверху вниз): btnCancel, btnOK;
- anchor - указывает с помощью так называемого якоря библиотеки Tkinter, в какой стороне или в каком углу пространства контейнера, выделенного под размещение
компонента, должен располагаться текущий компонент. Якорь задается в виде строки:
- "w" (левая сторона),
- "nw" (левый верхний угол),
- "n" (верхняя сторона),
- "nе" (правый верхний угол),
- "e" (правая сторона),
- "se" (правый нижний угол),
- "s" (нижняя сторона),
- "sw" (левый нижний угол) или
- "center" (середина - поведение по умолчанию):
btnClose.pack(anchor="ne")
Этот параметр имеет смысл задавать, если размеры компонента меньше размеров выделенного под него свободного пространства;
- fill - указывает, будет ли текущий компонент растягиваться, чтобы занять оставшееся свободное пространство. Значение задается в виде строки:
- "none" (не будет растягиваться - поведение по умолчанию),
- "x" (будет растягиваться по горизонтали),
- "y" (будет растягиваться по вертикали) или
- "both" (будет растягиваться по горизонтали и вертикали):
Этот параметр имеет смысл задавать, если размеры компонента меньше размеров выделенного под него свободного пространства:
- expand - указывается только в том случае, если значение параметра fill отлично от "none", и только для нескольких компонентов. В таком случае все свободное
пространство в контейнере будет равномерно распределено между всеми компонентами, у которых для параметра expand задано значение True. Значение по умолчанию - False (пространство контейнера
между компонентами не распределяется);
- ipadx - задает величину отступа между границами компонента и его содержимым по горизонтали в виде дистанции библиотеки Tkinter. Дистанция может быть задана в виде:
- целого числа - непосредственно указывает дистанцию, измеренную в пикселях;
- строки формата <Значение дистанции><Единица измерения> - здесь в качестве единицы измерения могут быть использованы:
миллиметры (m), сантиметры (c), дюймы (i) и пункты (р). Значение по умолчанию - 0 (отступы отсутствуют);
- ipady - задает величину отступа между границами компонента и его содержимым по вертикали в виде дистанции. Значение по умолчанию - 0 (отступы отсутствуют):
btnShow.pack(ipadx=10, ipady="2m")
Здесь мы указываем отступы по горизонтали равными 10 пикселям, а по вертикали - 2 мм;
- padx - задает величину отступа между границами соседних компонентов и границами текущего компонента и контейнера, в котором он находится, по горизонтали в виде дистанции. Может быть задана в виде:
- обычного значения - указывает отступы и слева, и справа;
- списка из двух элементов: значение первого элемента укажет отступ слева, второго - справа.
Значение по умолчанию - 0 (отступы отсутствуют);
- pady - задает величину отступа между границами соседних компонентов и границами текущего компонента и контейнера, в котором он находится, по вертикали в виде дистанции. Может быть задана в виде:
- обычного значения - указывает отступы и сверху, и снизу;
- списка из двух элементов: значение первого элемента укажет отступ сверху, второго - снизу.
Значение по умолчанию - 0 (отступы отсутствуют);
В следующем примере мы указываем отступы по горизонтали слева и справа равными 10 пикселям, а по вертикали - 2 мм сверху и 1 см снизу:
btnShow.pack(padx=10, pady=("2m", "lc"))
- in_ - задает контейнер, в который будет помещен текущий компонент. Если параметр не указан, компонент будет помещен в его родитель, заданный в первом параметре конструктора класса компонента при его создании.
Варьируя значения параметров, задаваемых в методе pack(), можно создавать приложения с довольно сложным интерфейсом. Код одного из таких приложений показан в примаере ниже.
Поле ввода и кнопка Вывести значение, находящиеся в окне, растягиваются по горизонтали, чтобы занять все свободное пространство окна по ширине, а кнопка Выход,
напротив, сохраняет свои размеры и в любом случае находится в правом нижнем углу окна. Попробуйте сами понять, каким путем это достигнуто.
import tkinter
import tkinter.ttk
class Application(tkinter.ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
# В вызове метода pack() самого контейнера, помещающего его
# в окно, мы также можем указать необходимые нам параметры
self.pack(fill="both", padx=4, pady=4)
self.create_widgets()
self.master.title("Pack")
# Указываем у окна возможность изменения только ширины
self.master.resizable(True, False)
def create_widgets(self):
entValue = tkinter.ttk.Entry(self)
entValue.pack(fill="x", padx=4)
btnShow = tkinter.ttk.Button(self, text="Вывести значение")
btnShow.pack(fill="x", padx=4, pady=(0, 10))
btnExit = tkinter.ttk.Button(self, text="Выход")
btnExit.pack(side="bottom", anchor="ne")
root = tkinter.Tk()
app = Application(master=root)
root.mainloop()
Архив с файлом можно взять
здесь.
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
При работе с диспетчером компоновки Pack также могут пригодиться следующие методы, поддерживаемые всеми компонентами:
- pack_forget () - удаляет текущий компонент из контейнера;
- pack_slaves () - возвращает список всех компонентов, находящихся в контейнере, у которого был вызван:
entValue.pack()
btnShow.pack()
btnExit.pack()
print(self.pack_slaves())
Результат:
[<tkinter.ttk.Entry object at 0x020DE530>,
<tkinter.ttk.Button object at 0x020DE3F0>,
<tkinter.ttk.Button object at 0x020DE970>]
- pack_infо () - возвращает все параметры, заданные при размещении текущего компонента, в виде словаря. Ключи элементов этого словаря соответствуют названиям параметров, а их
значения - и есть значения этих параметров (с учетом параметров, установленных в приведенной программе):
print(btnExit.pack_info())
Результат:
{'in': <__main__.Application object at 0x0216E370>, 'padx': 0, 'ipady': 0,
'pady': 0, 'expand': 0, 'ipadx': 0, 'fill': 'none', 'side': 'bottom',
'anchor': 'ne'}
На следующем шаге мы рассмотрим диспетчер компоновки Place.
Предыдущий шаг
Содержание
Следующий шаг