Rozdział 18 · Canvas serio

Cykl życia gestu myszy

Rysowanie jednej figury to sekwencja trzech różnych wydarzeń, a nie jedno.

Jeden gest, trzy wydarzenia

Narysowanie pojedynczego kształtu myszką to nie jedno zdarzenie, lecz ciąg trzech różnych Typy, które razem tworzą gest „naciągnij”

<Button-1>
Lewy przycisk myszy naciśnięty
start_x, start_y
Zapamiętujemy punkt początkowy
↻ 0, 1 lub wiele razy
<B1-Motion>
Myszka porusza się z przyciskiem przytrzymanym
coords() / create_line()
Zaktualizuj podgląd lub kreskę
<ButtonRelease-1>
Przycisk został zwolniony
render_document()
Poprawianie liczby lub akcji
press → drag (0, 1 lub wiele razy) → release — ten sam gest dla ołówka, linii, prostokąta i owalu.
WydarzenieKiedy się uruchamia
<Button-1>dokładnie raz — w momencie naciśnięcia lewego przycisku
<B1-Motion>wiele razy pod rząd, gdy przycisk jest przytrzymywany, a mysz porusza się
<ButtonRelease-1>dokładnie raz, gdy przycisk zostanie zwolniony
&lt;Motion&gt; NIE jest &lt;B1-Motion&gt;
<Motion> wywołuje się przy JAKIMKOLWIEK ruchu myszy nad płótnem — nawet jeśli nie naciśnięto żadnego przycisku. <B1-Motion> — tylko przy ruchu z wciśniętym LEWYM przyciskiem. Pomylenie ich to częsta przyczyna, dla której rysowanie zaczyna się bez kliknięcia (rozdział 18.31, Debug Lab).

Wszystkie pożądane współrzędne przechodzą przez ten sam obiekt Eventto a w rozdziale 17 — event.x, event.y. event.widget jest również dostępny, choć zwykle jest dostępny na pojedynczym płótnie Tak oczywiste.

Klik bez przeciągania — nie zapomnij o tym przypadku

Co jeśli użytkownik nacisnął i natychmiast puścił przycisk w pewnym momencie, nie poruszając myszką? <B1-Motion> w tym przypadku nie wydarzy się ani raz, wydarzenie uruchomi się tylko wtedy, gdy mysz faktycznie się poruszy. Ostateczne zastosowanie (Rozdział 18.32) Wyraźnie to sprawdza: jeśli punkt startowy i punkt zwolnienia są prawie takie same, to linia, prostokąt Albo po prostu nie powstaje owal – zamiast niewidzialnej figury o zerowym rozmiarze.

Praktyka: Gest myszy press → drag → release
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →