Глава 16 · Создаём классные приложения с Tkinter

Метки, кнопки и их размещение

Первые интерактивные виджеты — и то, как Tkinter размещает их в окне.

Виджет — визуальный объект интерфейса

Виджет (widget) — любой видимый/интерактивный элемент интерфейса: метка, кнопка, поле ввода. Как и в главе 14, каждый виджет — экземпляр класса со своими атрибутами и методами. Метка (Label) показывает текст, кнопка (Button) реагирует на клик.

metki_knopki.py
import tkinter as tk

root = tk.Tk()

label = tk.Label(root, text="Привет, Tkinter!")
label.pack()

def na_knopku_nazhali():
    print("Кнопку нажали!")

button = tk.Button(root, text="Нажми меня", command=na_knopku_nazhali)
button.pack()

root.mainloop()
Окно с меткой «Привет, Tkinter!» и кнопкой «Нажми меня»
Результат выполнения кода выше — настоящее окно Tkinter. Пример внешнего вида на среде курса. На вашей ОС шрифты, размеры и тема могут немного отличаться.
Создание виджета — это не то же самое, что его показ
tk.Button(root, ...) лишь создаёт объект кнопки. Он не появится в окне, пока вы не разместите его через менеджер геометрии.pack() здесь, или .grid() (раздел 16.7), или .place() (раздел 16.15).

command — функция, а не вызов функции

Параметр command связывает кнопку с функцией — важно передать саму функцию, без скобок: command=na_knopku_nazhali, а не command=na_knopku_nazhali().

Частая ошибка: скобки в command
na_knopku_nazhali — это сама функция как объект (глава 13). na_knopku_nazhali() — это вызов функции прямо сейчас. command=na_knopku_nazhali() вызовет функцию немедленно, один раз, при создании кнопки — и свяжет кнопку с тем, что функция вернула (обычно None), а не с самой функцией. Клики по кнопке после этого ничего не вызовут.
Обычная кнопка рядом с недоступной (disabled) кнопкой
state="disabled" делает кнопку визуально и функционально недоступной. Пример внешнего вида на среде курса. На вашей ОС шрифты, размеры и тема могут немного отличаться.
state="disabled"
Кнопку можно сделать временно недоступной — button.state(["disabled"]) у ttk-виджетов или state="disabled" при создании. Полезно, пока данные ещё не готовы для действия (раздел 16.23 — валидация).

Подробно о pack

.pack() — самый простой способ разместить виджет в окне. По умолчанию виджеты укладываются друг под другом сверху вниз, но есть полезные параметры:

pack_podrobno.py
label.pack(side="left", padx=10, pady=10)
# side: top (по умолчанию), bottom, left, right
# padx/pady: внешний отступ по горизонтали/вертикали

Подробнее про fill/expand и группировку через Frame — в разделах 16.13–16.14.

Практика: Label, Button и pack()
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →