Piszę aplikację graficzną opartą na kivy, w której mogę dynamicznie dodawać węzły do obszaru rysowania, a następnie łączyć je z liniami skierowanymi (= krawędź). Węzły mogą być przeciągane wewnątrz obszaru rysowania, a krawędzie powinny być zawsze z nimi połączone.Jak mogę usunąć określone instrukcje z kanonu widgetu kivy?
Klasa krawędzi pochodzi z klasy Widget. Jego prezentacja graficzna składa się z dwóch części, samej linii (= Linia) i wierzchołka linii (= Trójkąt). Po narysowaniu widgetu Edge jego płótno jest najpierw tłumaczone i obracane, po czym wierzchołek krawędzi jest przeciągany do płótna. Następnie płótno zostanie obrócone do pierwotnego położenia, a część liniowa zostanie przeciągnięta do płótna.
Po przesunięciu węzłów płótno widżetu Krawędź zostanie wyczyszczone, a prezentacja graficzna zostanie ponownie narysowana. Jednak to nie działa tak, jak planowałem.
Jeśli użyję metody self.canvas.clear() na początku metody rysowania klasy Edge, stara linia nie zostanie usunięta i otrzymam wiele linii na kanwie.
Jeśli używam self.canvas.after.clear(), otrzymuję całkowicie pomieszany widok mojego obszaru rysowania, ponieważ metoda clear usuwa również instrukcję PopMatrix z canvas.after.
Jak mogę po prostu usunąć graficzną prezentację linii z canvas.after? Czy jest lepszy sposób na zrobienie tego?
plik Kivy mojej klasie krawędzi:
<Edge>:
id: ed
size_hint: None, None
canvas.before:
Color:
rgb: 0.9, 0.1, 0.1
PushMatrix
Translate:
x: ed.translate_x
y: ed.translate_y
Rotate:
angle: ed.rot_angle
origin: ed.rot_origin_x, ed.rot_origin_y
canvas.after:
PopMatrix
UPDATE zmieniłem podejście i teraz rysuję wszystko na płótnie zamiast rysowania na płótnie i canvas.after. Teraz otrzymałem wynik, który chciałem, ale jeśli ktoś wie, jak usunąć poszczególne instrukcje na płótnie, byłoby miło wiedzieć.