Глава 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 : Eventwidget = виджет-источникtype = тип событияkeysym = 'Return', 'a', ...char = текстовый символkeycode = числовой кодx = координата X внутри виджетаy = координата Y внутри виджета
Не каждое поле имеет смысл для каждого события — подробнее ниже.
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
Практика выполняется локально
Открыть практику →