Глава 17 · События глубже

Event, callback, command и binding

«Кнопки Tkinter — это и есть игра» — неверная модель. Начнём с вопроса: кто вообще вызывает ваш callback?

Кто вызывает on_click()?

Сравним два знакомых способа получить действие от пользователя.

posledovatelno.py
imya = input("Как вас зовут? ")
print(f"Привет, {imya}!")

Здесь всё просто: программа сама, в известной строке кода, спрашивает и ждёт ответа.

gui.py
def on_click():
    print("Кнопка нажата")

button = ttk.Button(root, text="OK", command=on_click)

Кто вызывает on_click()? Не мы — в коде нет строки on_click(). Функция может выполниться через секунду, через час или никогда — в зависимости от того, нажмёт ли пользователь кнопку.

ваш код
регистрирует callback
ждёт / обрабатывает
событийный цикл
действие пользователя
Tk вызывает callback
ваш код выполняется
возврат в событийный цикл
Callback — это код, вызов которого откладывается до наступления события.
Ответ
Callback вызывает система событий Tk — в момент, когда происходит соответствующее действие пользователя (или другое событие). Не ваш код, не интерпретатор Python сам по себе.

Event, callback, command, binding — четыре разных слова

ТерминЧто это
EVENT (событие)Факт: что-то произошло — клик, нажатие клавиши, наведение курсора
CALLBACK (обратный вызов)Функция, которую вызывают В ОТВЕТ на событие
COMMAND (команда)Высокоуровневый крючок конкретного виджета для его основного действия (например, клика по Button)
BINDING (привязка)Связь между событием (последовательностью) и callback-функцией
Они связаны, но не взаимозаменяемы
Событие — это ЧТО произошло. Callback — функция, которая ОТРЕАГИРУЕТ. Command — частный случай, специфичный для конкретного виджета. Binding — механизм, который соединяет событие с callback-ом. Спутать эти слова — источник путаницы в объяснении собственного кода.
Практика: классификация event/callback/command/binding
Автоматическая проверка — классифицируем короткие примеры кода по этим четырём терминам
Открыть практику →