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