2013-04-05 15 views
25

Wenn ich zeichne eine Form mit:Wie wird Tkinter Canvas gelöscht?

canvas.create_rectangle(10, 10, 50, 50, color="green") 

Hat Spur der Tatsache Tkinter behalten, dass es erstellt wurde?

In einem einfachen Spiel, das ich mache, hat mein Code eine Frame erstellen Sie eine Reihe von Rechtecken, und zeichnen Sie dann ein großes schwarzes Rechteck, um den Bildschirm zu löschen, und zeichnen Sie eine andere Reihe von aktualisierten Rechtecke und so weiter.

Erstelle ich Tausende von Rechteckobjekten im Speicher?

Ich weiß, dass Sie den Code oben auf eine Variable zuweisen können, aber wenn ich dies nicht tun und nur direkt auf die Leinwand zeichnen, bleibt es im Speicher, oder zeichnet nur die Pixel, wie im HTML5 Segeltuch?

Antwort

47

Jedes Leinwandelement ist ein Objekt, das von Tkinter überwacht wird. Wenn Sie den Bildschirm löschen, indem Sie nur ein schwarzes Rechteck zeichnen, haben Sie effektiv ein Speicherleck erstellt - schließlich wird Ihr Programm aufgrund der Millionen von Elementen, die gezeichnet wurden, abstürzen.

Verwenden Sie zum Löschen einer Zeichenfläche die Methode delete. Geben Sie ihm den speziellen Parameter "all" alle Elemente auf der Leinwand zu löschen (die Zeichenfolge "all" "ist ein besonderer Tag, das alle Elemente auf der Leinwand darstellt):

canvas.delete("all") 

Wenn Sie nur bestimmte Elemente auf der Leinwand löschen (B. Vordergrundobjekte, während die Hintergrundobjekte auf dem Display belassen werden, können Sie jedem Element Tags zuweisen. Dann könnten Sie anstelle von "all" den Namen eines Tags angeben.

Wenn Sie ein Spiel erstellen, werden Sie Wahrscheinlich müssen Sie keine Objekte löschen und neu erstellen.Wenn Sie beispielsweise ein Objekt haben, das sich über den Bildschirm bewegt, können Sie move oderverwendenMethode zum Verschieben des Elements.

3

Elemente, die auf die Leinwand gezeichnet werden, sind persistent. create_rectangle gibt eine Artikel-ID zurück, die Sie im Auge behalten müssen. Wenn Sie alte Gegenstände nicht entfernen, wird Ihr Programm eventuell langsamer.

Von Fredrik Lundhs An Introduction to Tkinter:

Beachten Sie, dass auf die Leinwand hinzugefügten Elemente gehalten werden, bis Sie sie entfernen. Wenn Sie die Zeichnung ändern möchten, können Sie entweder Methoden wie coords, itemconfig und move, um die Elemente zu ändern oder sie verwenden delete zu entfernen.

+0

Gibt es eine Möglichkeit, ohne Persistenz zu zeichnen? –

+1

@ TaylorHill: Nein. Aber als DaveTheScientist können Sie Canvas-Tags verwenden, um Ihre Canvas-Widgets zu sammeln. Erstellen Sie das Widget, indem Sie das Argument 'tags = 'my_tag'' hinzufügen. Wenn Sie dann den Bildschirm löschen möchten, können Sie 'canvas.delete ('my_tag')' 'tun. Alle Canvas-Widgets, die mit "my_tag" gekennzeichnet sind, werden gelöscht. –

1

Ja, ich glaube, Sie erstellen Tausende von Objekten. Wenn Sie nach einer einfachen Möglichkeit suchen, mehrere davon auf einmal zu löschen, verwenden Sie Canvas-Tags described here. Auf diese Weise können Sie dieselbe Operation (z. B. Löschen) für eine große Anzahl von Objekten ausführen.

+0

Wenn ich ein Bündel von Formen die gleiche ID wie "Kachel" zuweisen, und ich lösche die Methode auf der ID "Kachel", löscht es alle auf einmal? –

+0

@ TaylorHill: ja. –

Verwandte Themen