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 : Eventwidget = widżet-źródłotype = typ wydarzeniakeysym = 'Return', 'a', ...char = symbol tekstowykeycode = kod numerycznyx = współrzędne X wewnątrz widgetuy = Y współrzędnych wewnątrz widżetu
Nie każde pole ma sens dla każdego wydarzenia – więcej szczegółów poniżej.
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
Otwórz praktykę →