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

Mouse Enter/Leave и hover

Наведение курсора — событие само по себе, без клика. Идеально для визуальных подсказок.

Enter / Leave — идеальны для визуальных эффектов

курсор входит в клетку
<Enter>
on_cell_enter(index)
без клика
курсор покидает клетку
<Leave>
on_cell_leave(index)
Наведение — не клик: ни одно из этих событий не должно менять игровое состояние.
hover_bind.py
button.bind(
    "<Enter>",
    lambda _event, i=index: self.on_cell_enter(i),
)
_event — намеренно неиспользуемое имя
Callback от .bind() обязан принять аргумент event, даже если он не нужен внутри. Имя _event (с подчёркиванием) — общепринятый сигнал «параметр существует по требованию сигнатуры, но сознательно не используется».

Binding scope — где действует привязка

ВызовОбласть действия
widget.bind(...)только для этого конкретного виджета
root.bind(...)для главного окна (например, глобальные клавиши игры)
ЧУТЬ ГЛУБЖЕ — bind_class / bind_all
Tk также поддерживает bind_class(...) (все виджеты одного класса) и bind_all(...) (буквально всё приложение). Для главы 17 они не нужны — упомянуты, чтобы вы знали, что они существуют, если понадобятся в собственных проектах.
ЧУТЬ ГЛУБЖЕ — add="+" и unbind()
По умолчанию bind(sequence, callback) ЗАМЕНЯЕТ предыдущий обработчик этой же последовательности на этом виджете. Необязательный третий аргумент add="+" вместо замены добавляет ЕЩЁ ОДИН обработчик — оба будут вызваны. widget.unbind(sequence) убирает привязку целиком. Для главы 17 не нужны — но Debug Lab 17 (раздел 17.29) показывает, почему неосторожный add="+" может незаметно запустить один и тот же код дважды.
Практика: hover через Enter/Leave
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально
Открыть практику →