Жизненный цикл жеста мыши
Рисование одной фигуры — это последовательность из трёх разных событий, а не одно.
Один жест, три события
Рисование одной фигуры мышью — это не одно событие, а последовательность из трёх разных типов, которые вместе образуют жест «нарисовать»:
| Событие | Когда срабатывает |
|---|---|
<Button-1> | ровно один раз — в момент нажатия левой кнопки |
<B1-Motion> | много раз подряд, пока кнопка зажата и мышь движется |
<ButtonRelease-1> | ровно один раз — в момент отпускания кнопки |
<Motion> срабатывает при ЛЮБОМ движении мыши над холстом — даже если ни одна кнопка не нажата. <B1-Motion> — только при движении с зажатой ЛЕВОЙ кнопкой. Перепутать их — частая причина, по которой рисование начинается без клика (раздел 18.31, Debug Lab).Все нужные координаты приходят через тот же объект Event, что
и в главе 17 — event.x, event.y.
event.widget тоже доступен, хотя для одного холста он обычно и
так очевиден.
Клик без перетаскивания — не забыть про этот случай
Что если пользователь нажал и сразу отпустил кнопку в одной точке, не подвинув мышь?
<B1-Motion> в этом случае не произойдёт ни разу — событие
сработает, только если мышь действительно сдвинулась. Финальное приложение (раздел 18.32)
явно проверяет это: если точка начала и точка отпускания почти совпадают, линия, прямоугольник
или овал попросту не создаётся — вместо невидимой фигуры нулевого размера.