GOOGLE ADS

Sonntag, 1. Mai 2022

Wie zerstöre ich Objekte auf einer Leinwand, ohne sie vollständig zu löschen?

Ich arbeite derzeit an einem meiner ersten Python-Projekte, dem Conway's Game of Life in tkinter. Mein aktuelles Design sollte Zellen (dargestellt durch eine Klasse) auf einem vordefinierten Raster zeichnen. Die Regeln sowie die GUI funktionieren und ich bin bereit, den Code zu erweitern. Insgesamt gibt es 3 Klassen:

  • Klasse GUI (einfache Benutzeroberfläche zum Starten der Animation)

  • Klasse Spiel (zeichnet das Raster und verwaltet Zellen)

  • Klasse Cell (Instanz – Zelle, zeichnet die Quadrate, die die Zellen darstellen)

  • Es gibt jedoch noch ein letztes großes Problem: Mein Code zeichnet wahrscheinlich jedes Mal, wenn ich meine afterSchleife ausführe, neue tote oder lebende Zellen auf die Zeichenfläche, was mein Programm innerhalb weniger Zyklen fast bis zum Stillstand verlangsamt. Wenn ich versuche, es an irgendeinem Punkt während der Schleife mit zu zerstören self.canvas.destroy(cell), ruft es sofort die __del__Methode der Zelle auf und das Gitter wird überhaupt nicht gezeichnet.

    Ich hoffe, dass der unten angegebene Code ausreicht, um mein Problem zu verstehen. Die isAlive()Methode prüft, ob die Zelle in der nächsten Iteration am Leben sein soll. drawGrid(), ist glaube ich selbsterklärend.

    Vielen Dank für jede Hilfe und liebe Grüße,

    Chris

    def play(self):
    self.isAlive()
    self.drawGrid()
    self.root.after(self.speed, self.play)

    auch der Fehler, der beim Schließen des rootFensters ausgegeben wird:

    invalid command name "2702053988288play"
    while executing
    "2702053988288play"
    ("after" script)


    Lösung des Problems

    Wenn Sie ein Objekt von einer Leinwand löschen möchten, verwenden Sie deletestatt destroy. Angenommen, celldies ist die ID eines oder mehrerer Canvas-Elemente, würde es wie folgt aussehen.

    self.canvas.delete(cell)

    Keine Kommentare:

    Kommentar veröffentlichen

    Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

    Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...