Метод 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 указывает на верхний левый угол.

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

Разместим три кнопки задавая абсолютные координаты x и y, точка начала отсчета от левого верхнего угла:

from tkinter import *

root = Tk()
root.geometry("300x150")

button_1 = Button(text="x=10, y=20", font=13)
button_1.place(x=10, y=20)
button_2 = Button(text="x=50, y=45", font=13)
button_2.place(x=50, y=45)
button_3 = Button(text="x=140, y=100", font=13)
button_3.place(x=140, y=100)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13

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

02_place

Рассмотрим пример с относительным заданием координат relx= и rely=, для кнопок расположенных по углам:

from tkinter import *

root = Tk()

button_top_left = Button(text="top left", font=13)
button_top_left.place(relx=0, rely=.0)
button_top_right = Button(text="top right", font=13)
button_top_right.place(relx=.7, rely=.0)
button_bottom_left = Button(text="bottom left", font=13)
button_bottom_left.place(relx=0, rely=.7)
button_bottom_right = Button(text="bottom right", font=13)
button_bottom_right.place(relx=.6, rely=.7)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14

При изменении размера окна кнопки не будут размещаться, правильно, по углам, но результат может быть следующим:

place_corners

Другой пример с размещением кнопки в центре окна:

from tkinter import *

clicks = 0

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

root = Tk()
root.geometry("300x100")

button = Button(text="Clicks 0", bg="#555", fg="#ccc", font=16, command=click_button)
button.place(relx=.5, rely=.5, anchor="c")

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

01_place

Упражнения

  1. Создайте окно заданного размера: 400 на 400 пикселей. Для решения используйте метод place() и абсолютное позиционирование x, y:

    • добавьте в четыре кнопки по углам, названия кнопок должны соответствовать их месту положения;
    • добавьте ещё одну кнопку расположенную по центру окна;
    • измените размер окна мышкой, и проанализируйте результат работы интерфейса.

    place_center_corners_xy

  2. Создайте окно заданного размера: 600 на 300 пикселей. Для решения используйте метод place() и относительное позиционирование relx, rely:

    • добавьте в четыре кнопки по центру сторон, названия кнопок должны соответствовать их месту положения;
    • добавьте ещё одну кнопку расположенную по центру окна;
    • измените размер окна мышкой, и проанализируйте результат работы интерфейса.

    place_center_corners_relx_rely

  3. Создайте окно заданного размера: 200 на 100 пикселей. Для решения используйте метод place() и относительное позиционирование relx, rely, anchor:

    • при одном нажатии на кнопку, она должна перемещаться по часовой стрелке на одну позицию: с верху на право, затем вниз, затем налево и обратно наверх.
    • при изменении размера окна положение кнопки должно корректно отображаться по краям окна.

    place_button_move

  4. Для дальнейшего переиспользования кода, создайте новый файл с названием app_change_language.py. Напишите программу-форму с переключением интерфейса английский/русский.

    03_place

    При нажатии на кнопу происходит переключение языка интерфейса на русский.

    04_place

    И обратное переключение с русского на английский язык.

    03_place

    Надписи на русском поместились не полностью. Это проблема метода place().

ВНИМАНИЕ:

Метод place() не отслеживает расширение виджетов. Поэтому не желателен для реализации интерфейса.