Глава 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
Практика выполняется локально