2014-05-13 11 views
6

Ich schreibe eine kivy-basierte Graph-App, in der ich Knoten dynamisch zu einem Zeichenbereich hinzufügen und sie dann mit gerichteten Linien (= Kante) verbinden kann. Knoten können innerhalb des Zeichenbereichs gezogen werden und Kanten sollten immer mit ihnen verbunden bleiben.Wie kann ich bestimmte Anweisungen von Kivy Widget Canvas entfernen?

Die Edge-Klasse wird von der Widget-Klasse abgeleitet. Seine grafische Darstellung besteht aus zwei Teilen, der Linie selbst (= Linie) und der Spitze der Linie (= Dreieck). Wenn ein Kanten-Widget gezeichnet wird, wird seine Leinwand zuerst übersetzt und gedreht, woraufhin die Spitze der Kante auf die Leinwand gezeichnet wird. Danach wird die Leinwand in ihre ursprüngliche Position zurückgedreht und der Linienteil wird nach canvas.afher gezeichnet.

Wenn Knoten verschoben werden, wird die Arbeitsfläche des Edge-Widgets gelöscht und die grafische Darstellung wird erneut gezeichnet. Dies funktioniert jedoch nicht wie geplant.

Wenn ich am Anfang der Zeichenmethode der Edge-Klasse self.canvas.clear() verwenden, wird die alte Zeile nicht entfernt und ich bekomme mehrere Zeilen auf der Zeichenfläche.

Wenn ich self.canvas.after.clear() verwende, bekomme ich eine völlig durcheinander geratene Ansicht meines Zeichnungsbereichs, da die clear-Methode auch die PopMatrix-Anweisung aus der Zeichenfläche entfernt.

Wie kann ich nur die grafische Darstellung der Linie aus der Leinwand entfernen.nach? Gibt es einen besseren Weg, dies zu tun?

Kivy Datei meiner Edge-Klasse:

<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 ich meinen Ansatz geändert und jetzt ziehe ich alles auf der Leinwand statt auf Leinwand und canvas.after der Zeichnung. Jetzt habe ich das Ergebnis, das ich wollte, aber wenn jemand weiß, wie man die einzelnen Leinwandanweisungen entfernt, wäre es nett zu wissen.

Antwort

6

Sie können entweder:

  1. ein Kinder einer Leinwand entfernen, indem canvas.remove() und übergeben Sie die Instanz der Graphikbefehle tun Sie wollen. Sie können iterieren und erhalten Sie eine mit canvas.children.

  2. Weisen Sie einer Canvas-Eigenschaft einen group-Namen zu, und verwenden Sie canvas.remove_group(). Dies ist der beste Weg, um viele Grafikanweisungen zu kategorisieren und zu entfernen, ohne einen Verweis darauf zu behalten.