На этом шаге мы рассмотрим назначение, его параметры и пример использования.
Диспетчер компоновки Place применяется, когда компоненты строго определенных размеров нужно разместить по строго определенным местам. Он требует точного указания местоположения и размеров компонентов при их размещении, причем местоположение и размеры могут быть указаны в абсолютных или относительных величинах.
Нужно отметить, что этот диспетчер компоновки также требует обязательного указания размеров контейнера (что можно сделать, применив опции width и height). Если этого не сделать, размеры контейнера при выводе окажутся нулевыми.
Вывод компонентов посредством диспетчера компоновки Place выполняется вызовом метода place([<Параметры>]), поддерживаемого всеми компонентами. Вот параметры, которые мы можем использовать в этом методе:
entName.place(х=5, y="1.5с")
При этом поле ввода entName будет располагаться по координатам (5 пикселей, 1,5 см);
btnAdd.place(relx=0.1, y=20)
При этом кнопка btnAdd будет находиться на расстоянии 10% ширины контейнера от его левой границы.
Если одновременно заданы параметры х и relx, их значения суммируются:
btnAdd.place(х=5, relx=0.1, у=20)
При этом горизонтальная координата кнопки будет равна сумме 10% от ширины контейнера и пяти пикселей;
btnAdd.place(х=5, rely=0.8)
При этом кнопка btnAdd будет находиться на расстоянии 80% высоты контейнера от его верхней границы.
Если одновременно заданы параметры y и rely, их значения суммируются:
btnAdd.place(х=5, у=-10, rely=0.8)
При этом горизонтальная координата кнопки будет равна разности 80% от высоты контейнера и 10 пикселей;
entName. place (х=5, y="1.5с", width=100, height="5m")
При этом поле ввода entName будет иметь ширину 100 пикселей и высоту 5 мм;
entAddress.place(х=0, у=0, relwidth=0.2)
При этом поле ввода entAddress займет 20% контейнера по ширине.
Если одновременно заданы параметры width и relwidth, их значения суммируются:
entAddress.place(х=0, у=0, relwidth=0.2, width=-5)
При этом ширина поля ввода entAddress будет равна 20% от ширины контейнера за вычетом пяти пикселей;
entAddress.place(х=0, у=0, relheight=0.5)
При этом поле ввода entAddress займет половину контейнера по высоте.
Если одновременно заданы параметры height и relheight, их значения суммируются:
entAddress.place(х=0, у=0, relheight=0.5, height=50)
При этом высота поля ввода entAddress будет равна сумме половины от высоты контейнера и 50 пикселей;
entName.place(relx=l.0, у=0, anchor="ne")
При этом поле ввода entName будет размещено в правом верхнем углу контейнера;
Ниже приведен текст приложения, аналогичного приложению из предыдущего шага. Интерфейс этого приложения создан с применением диспетчера компоновки Place.
import tkinter import tkinter.ttk class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) # Обязательно указываем ширину и высоту контейнера посредством # опций width и height соответственно self.configure(width=200, height=100) self.pack(padx=4, pady=4) self.create_widgets() self.master.title("Place") # Запрещаем изменять размеры окна self.master.resizable(False, False) def create_widgets(self): entValue = tkinter.ttk.Entry(self) entValue.place(x=4, y=4, width=-8, relwidth=1.0, height=22) btnShow = tkinter.ttk.Button(self, text="Вывести значение") btnShow.place(x=4, y=30, width=-8, relwidth=1.0, height=26) btnExit = tkinter.ttk.Button(self, text="Выход") btnExit.place(x=-64, relx=1.0, y=-30, rely=1.0, width=60, height=26) root = tkinter.Tk() app = Application(master=root) root.mainloop()
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
Нам могут также пригодиться следующие методы, поддерживаемые всеми компонентами:
print(btnExit.place_info())
{'anchor': 'nw', 'width': '60',
'in': <__main__.Application object at 0x0235E370>, 'x': '-64', 'rely': '1',
'relwidth': '', 'y': '-30', 'height': '26', 'relheight': '', 'relx': '1',
'bordermode': 'inside'}
На следующем шаге мы рассмотрим диспетчер компоновки Grid.