Rozdział 18 · Narzędzia do rysowania
Gumka
Na Canvas „wymaż” — nie jest jedyną możliwą akcją. Omówimy, jaki sens wybrano tutaj i dlaczego.
Co właściwie oznacza „usunąć” na Canvas?
W edytorze graficznym z zwykłą bitmapą gumka jest oczywista: malowanie pikseli o kolorze tła. Ale Canvas przechowuje nie piksele, lecz elementy (sekcja 18.8) — i „wymazuje”
Trzy uczciwe znaczenia słowa „gumka"
Pomaluj obszar kolorem tła
→
gumka = kolor tła ołówka
Usuń cały dotknięty element
→
potrzebują hit-test – find_overlapping()
Usuń tylko część pociągnięcia pod kursorem
→
trudne: trzeba by pociąć pierwiastek na części
Na tym kursie wybrano pierwszą, najbardziej przewidywalną opcję: gumka to ten sam ołówek (Rozdział 18.14) tylko kolor pociągnięcia jest wymuszony z kolorem tła płótna:
lastik.py
def on_drag(self, event):
tool = self.state.tool
if tool in (Tool.PENCIL, Tool.ERASER):
color = CANVAS_BG if tool is Tool.ERASER else self.state.color
self.canvas.create_line(
self.state.last_x, self.state.last_y, event.x, event.y,
fill=color, width=self.state.width, capstyle=tk.ROUND,
)
self.state.last_x, self.state.last_y = event.x, event.y
To NIE jest prawdziwe usuwanie dotkniętych elementów
Taki gumka rysuje NOWY element koloru tła na starych — same stare figury pozostają w dokumencie, po prostu są wizualnie przykryte. Jeśli tło płótna kiedykolwiek się zmieni (np. dodasz obraz tła), „wymazane” linie znowu staną się widoczne — to nie jest błąd, lecz bezpośrednia konsekwencja wybranego modelu.
Prawdziwe usunięcie jest opcjonalnym rozszerzeniem
Metoda
canvas.find_overlapping(x1, y1, x2, y2) znajduje wszystkie elementy w prostokątnym obszarze pod kursorem gumki — można je naprawdę usunąć przez canvas.delete(item_id). To uczciwa, ale znacznie bardziej złożona alternatywa: wymaga podjęcia decyzji, co zrobić, jeśli gumka dotyka tylko CZĘŚCI długiej figury. Nie jest to implementowane w tym rozdziale, ale jest wspomniane jako realny kierunek rozwoju.Praktyka: gumka jako pociągnięcie koloru tła
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie