Глава 17 · События глубже
command vs bind — что выбирать
Не «bind существует, значит используем его везде» — у каждого инструмента своя работа.
command= или bind() — как выбирать
Что выбрать?
Нужно выполнить основное действие Button
→
command=
Нужны координаты движения мыши
→
bind("<Motion>", ...)
Нужно знать, какая именно клавиша нажата
→
bind("<Key>", ...)
Нужна реакция на наведение курсора (без клика)
→
bind("<Enter>"/"<Leave>", ...)
Виджет вообще не предоставляет command (например, Label, Frame)
→
bind()
Не заменяйте Button.command на bind('<Button-1>', ...) по умолчанию
Это профессиональное правило.
command= у Button — семантическая активация: она описывает основное действие кнопки, а встроенное поведение класса Button решает, какие способы активации вызывают эту команду. Конкретные клавиши могут отличаться у tk.Button и ttk.Button, а также между платформами и темами. Голая привязка <Button-1> описывает только конкретное событие мыши и обходит семантическое действие виджета. Замена command на bind «просто потому что можно» — типичная архитектурная ошибка, не стилистическая мелочь.Как это распределится в игре
Три задачи — три разных инструмента
Ход по клетке
command= у Button
основное действие виджета
Наведение — превью
bind(<Enter>/<Leave>)
нет готового command для этого
Клавиши 1–9 / R
bind(<Key>) на root
не привязано к одному виджету
Практика: command vs bind — что выбрать
Автоматическая проверка — для набора сценариев выбираем правильный инструмент