Глава 17 · События глубже
Объект Event
Callback из bind() получает Event; callback из command= обычно вызывается без него. Разберём, что внутри этого объекта.
Не каждый callback получает event
Частое заблуждение: «обработчик события всегда принимает event». Это неточно.
command= против bind()
command= — БЕЗ event
def new_game():
...
ttk.Button(root, text="Новая игра", command=new_game)
bind() — С event
def on_key(event):
...
root.bind("<KeyPress>", on_key)
Что использовать сегодня:
command= вызывает функцию БЕЗ аргументов. .bind(sequence, callback) вызывает функцию С ОДНИМ аргументом — объектом Event. Перепутать сигнатуру — частая причина TypeError.Объект Event — что внутри
event.x не имеет смысла для нажатия клавиши
Event — один класс на все типы событий, поэтому у него много полей сразу. Но event.x/event.y осмысленны для событий мыши, а не клавиатуры; event.keysym/event.char — для клавиатуры, а не для наведения мыши. Не читайте поле, если не уверены, что оно применимо к этому типу события.event.widget
event_widget.py
def on_enter(event):
print(event.widget) # какой именно виджет получил событие
event.widget — виджет, к которому относится событие. Это
источник UI-события, а не игровое состояние (важное различие — раздел 17.18).
Практика: инспектор объекта Event
Модуль tkinter открывает нативное окно Python — выполните локально в VS Code, PyCharm или Jupyter
Практика выполняется локально