Rozdział 17 · Wydarzenia głębiej

Mouse Enter/Leave i hover

Najazd kursorem — zdarzenie samo w sobie, bez kliknięcia. Idealne dla wizualnych podpowiedzi.

Enter / Leave – idealne do efektów wizualnych

kursor wchodzi do klatki
<Enter>
on_cell_enter(index)
bez klikania
kursor opuszcza komórkę
<Leave>
on_cell_leave(index)
Hover to nie kliknięcie: Żadne z tych zdarzeń nie powinno zmieniać stanu gry.
hover_bind.py
button.bind(
    "<Enter>",
    lambda _event, i=index: self.on_cell_enter(i),
)
_event jest celowo nieużywaną nazwą
Callback od .bind() jest zobowiązany zaakceptować ten argument event, nawet jeśli nie jest potrzebna w środku. Imię _event (podkreślone) to powszechny sygnał „parametr istnieje na żądanie sygnatury, ale nie jest świadomie używany”

Binding scope — gdzie więź jest ważna

ChallengeZakres
widget.bind(...)tylko dla tego konkretnego widgetu
root.bind(...)dla głównego okna (np. globalne klawisze gry)
TROCHĘ GŁĘBIEJ — bind_class / bind_all
Tk również wspiera bind_class(...) (wszystkie widżety tej samej klasy) oraz bind_all(...) (dosłownie cała aplikacja). W rozdziale 17 nie są potrzebne — są wspomniane, żebyś wiedział, że istnieją, jeśli będziesz ich potrzebować w swoich projektach.
NIECO GŁĘBIEJ — add=«+» i unbind()
Domyślnie bind(sequence, callback) ZASTĘPUJE poprzedni uchwyt tej samej sekwencji na tym widżecie. Opcjonalny trzeci argument add="+" zamiast zamiany dodaje JESZCZE JEDEN uchwyt — oba zostaną wywołane. widget.unbind(sequence) całkowicie usuwa kotwicę. Dla rozdziału 17 nie są potrzebne — ale Debug Lab 17 (Rozdział 17.29) pokazuje, dlaczego nieostrożność add="+" może uruchomić ten sam kod dwa razy, nie zauważając tego.
Praktyka: hover aż do Enter/Leave
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →