2014-05-13 14 views
6

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ć.

Odpowiedz

6

Można:

  1. usunąć do dzieci płótnie wykonując canvas.remove() i przekazać instancję instrukcji graficznych chcesz. Możesz iterować i uzyskać ten z canvas.children.

  2. przypisz nazwę group do właściwości canvas, a następnie użyj canvas.remove_group(). Jest to najlepszy sposób kategoryzowania i usuwania wielu instrukcji graficznych bez zachowania odniesienia do nich.

Powiązane problemy