Rozdział 17 · Wydarzenia głębiej
Obiekt Event
Callback z bind() otrzymuje Event; callback z command= zwykle jest wywoływany bez niego. Przyjrzyjmy się, co znajduje się wewnątrz tego obiektu.
Nie każdy callback dostaje event
Powszechnym błędnym przekonaniem jest to, że „obsługa zdarzeń zawsze przyjmuje event”
command= kontra bind()
command= — BEZ event
def new_game():
...
ttk.Button(root, text=„Nowa Gra”, command=new_game)
bind() — S event
def on_key(event):
...
root.bind("<KeyPress>", on_key)
Co używać dzisiaj:
command= wywołuje funkcję BEZ argumentów. .bind(sequence, callback) wywołuje funkcję Z JEDNYM argumentem — obiektem Event. Pomyłka w podpisie to częsta przyczyna TypeError.Przedmiot Event - Co jest w środku
event.x nie ma sensu wciskać klawisza
Event jest jedną klasą dla wszystkich typów zdarzeń, więc ma wiele pól jednocześnie. Ale event.x/event.y są istotne dla zdarzeń myszy, nie dla klawiatur. event.keysym/event.char jest dla klawiatury, nie dla przesuwania myszką. Nie czytaj tego pola, chyba że jesteś pewien, że dotyczy tego typu zdarzenia.event.widget
event_widget.py
def on_enter(event):
print(event.widget) # który dokładnie widget otrzymał zdarzenie
event.widget jest widżetem, do którego należy to zdarzenie. To jest
źródłem zdarzeń UI-, a nie stanem gry (Rozdział 17.18 to istotna różnica).
Praktyka: inspektor obiektu Event
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie