Rozdział 17 · Wydarzenia głębiej

Focus i klawiatura

Istnieje okno, nie znaczy, że dostaje wszystkie naciśnięcia klawiszy. Potrzebujesz skupienia.

Wydarzenia klawiaturowe wymagają miejsca docelowego

Okno z przypisaniem klawiszy nie oznacza, że naciśnięcie DOWOLNEGO klawisza gdziekolwiek będzie należeć do tego handlera. Każde zdarzenie klawiatury najpierw trafia do widżetu, który Teraz skupienie inputu — a potem Tk sprawdza wiązania łańcucha bindtags: Sam widget → swoją klasę → okno najwyższego poziomu (root) → „all”

focus_demo.py
print(root.focus_get())   # który widżet jest teraz w fokusu (lub None)

entry.focus_set()         # jawnie przekazać fokus temu widżetowi
"Binding doesn't works" często oznacza "klasa widget przechwyciła zdarzenie jako pierwsza"
root.bind(<Key>„” Entry jako pierwszy przetwarza naciśnięcie liczby (wprowadza symbol do pola); wiąże się z root w tym przypadku zwykle NADAL wystrzeluje następny, chyba że handler wyraźnie wrócił "break"przez przerwanie łańcucha. Oznacza to, że symbol pojawi się w polu wejściowym, a jednocześnie trafi do logiki gry — rzadko co to, czego chciałeś. Zobacz Debug Lab 1 (sekcja 17.29).

W rozdziale 17 przypisania klawiatury są zawieszone root — ale, jak właśnie pokazano, skupienie na Entry lub Text samo w sobie NIE wyłącza powiązania z root (w naszej grze takich pól nie ma — wszystkie komórki to przyciski). W aplikacji z polami tekstowymi ważne jest, aby nie „utrzymywać fokusu na root”, lecz świadomie zdecydować: czy skróty klawiszowe w grze powinny działać, gdy użytkownik wpisuje tekst? Jeśli nie — handler może sprawdzić focus_get() sam ignoruj prasę, gdy jest to skupienie w polu tekstowym.

Praktyka: focus_get() i focus_set()
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →