9. Tkinter. Позиционирование элементов

9.1. Метод place()

Метод place() позволяет более точно настроить параметры позиционирования. Он принимает следующие параметры:

  • height и width: устанавливают соответственно высоту и ширину элемента в пикселях
  • relheight и relwidth: также задают соответственно высоту и ширину элемента, но в качестве значения используется число float в промежутке между 0.0 и 1.0, которое указывает на долю от высоты и ширины родительского контейнера
  • x и y: устанавливают смещение элемента по горизонтали и вертикали в пикселях соответственно относительно верхнего левого угла контейнера
  • relx и rely: также задают смещение элемента по горизонтали и вертикали, но в качестве значения используется число float в промежутке между 0.0 и 1.0, которое указывает на долю от высоты и ширины родительского контейнера
  • bordermode: задает формат границы элемента. Может принимать значение INSIDE (по умолчанию) и OUTSIDE
  • anchor: устанавливает опции растяжения элемента. Может принимать значения n, e, s, w, ne, nw, se, sw, c, которые являются сокращениями от Noth(север - вверх), South (юг - низ), East (восток - правая сторона), West (запад - левая сторона) и Center (по центру). Например, значение nw указывает на верхний левый угол

Например, разместим кнопку с шириной 130 пикселей и высотой 30 пикселей в центре окна:

from tkinter import *

clicks = 0


def click_button():
    global clicks
    clicks += 1
    btn.config(text="Clicks {}".format(clicks))

root = Tk()
root.title("GUI на Python")
root.geometry("300x250")


btn = Button(text="Clicks 0", background="#555", foreground="#ccc",
             padx="20", pady="8", font="16", command=click_button)
btn.place(relx=.5, rely=.5, anchor="c", height=30, width=130, bordermode=OUTSIDE)

root.mainloop()

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

скриншот

Следует заметить, что при использовании метода place() не надо использовать метод pack(), чтобы сделать элемент видимым.

Или разместим три кнопки:

from tkinter import *

root = Tk()
root.title("GUI на Python")
root.geometry("300x250")

btn1 = Button(text="x=10, y=20", background="#555", foreground="#ccc", padx="14", pady="7", font="13")
btn1.place(x=10, y=20)

btn2 = Button(text="x=50, y=100", background="#555", foreground="#ccc", padx="14", pady="7", font="13")
btn2.place(x=50, y=100)

btn3 = Button(text="x=140, y=160", background="#555", foreground="#ccc", padx="14", pady="7", font="13")
btn3.place(x=140, y=160)

root.mainloop()

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

скриншот

9.2. Метод grid()

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

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

  • column: номер столбца, отсчет начинается с нуля
  • row: номер строки, отсчет начинается с нуля
  • columnspan: сколько столбцов должен занимать элемент
  • rowspan: сколько строк должен занимать элемент
  • ipadx и ipady: отступы по горизонтали и вертикали соответственно от границ элемента до его текста
  • padx и pady: отступы по горизонтали и вертикали соответственно от границ ячейки грида до границ элемента
  • sticky: выравнивание элемента в ячейке, если ячейка больше элемента. Может принимать значения n, e, s, w, ne, nw, se, sw, которые указывают соответствующее направление выравнивания

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

from tkinter import *

window = Tk()
window.title("Welcome to grid app!")
window.geometry('350x200')
lbl = Label(window, text="Hello!")
btn = Button(window, text="Click Me!")
lbl.grid(column=0, row=0)
btn.grid(column=1, row=0)
window.mainloop()

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

скриншот

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

from tkinter import *

window = Tk()
window.title("Welcome to grid app!")
lbl = Label(window, text="Hello!")
btn1 = Button(window, text="Click Me!")
btn2 = Button(window, text="Click Me!")
btn3 = Button(window, text="Click Me!")
btn1.grid(column=0, row=0)
lbl.grid(column=1, row=0)
btn2.grid(column=2, row=0)
btn3.grid(column=1, row=1)
window.mainloop()

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

скриншот

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

from tkinter import *

root = Tk()
root.title("Welcome to the second entry app")
lbl_login = Label(root, text="Login")
lbl_pass = Label(root, text="Password")
txt1 = Entry(root, width=10)
txt2 = Entry(root, width=10)
btn = Button(root, text="Enter")
lbl_login.grid(row=0, sticky=E)
lbl_pass.grid(row=1, sticky=E)
txt1.grid(row=0, column=1)
txt2.grid(row=1, column=1)
btn.grid(columnspan=2, sticky=NSEW)
root.mainloop()

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

скриншот