Python GUI Tkinter Buttons blinken bei laufender Akutalisierung?
Hallo,
ich möchte mit Phyton und der Bibliothek Tkinter eine GUI für ein Kartenspiel programmieren.
Für das Kartenspiel müssen ständig neue Karten geladen werden.
Das heißt, es wird zum Beispiel andauernd überprüft wie viele Karten die Spieler in der Auslage und in der Hand haben und dementsprechend werden dann Labels und Buttons generiert.
Die Idee ist, einfach laufend die GUI in gewissen Abständen (zum Beispiel einige Dutzend Millisekunden) zu aktualisieren.
Wenn ich das mache blinken die Labels und Buttons aber immer auf.
Nach Recherche soll das daran liegen, dass sie immer wieder in zu kurzen Abständen neu erstellt werden.
Man könnte die GUI natürlich immer nur dann neu erstellen lassen, wenn tatsächlich im Spiel etwas passiert.
Das passiert aber andauernd, weswegen es besser ist, einfach laufend die GUI zu aktualisieren.
Gibt es dafür noch eine andere Methode (Zum Beispiel PyGame anwenden)?
Hier ein Minimalbeispiel:
class DynamicInterfaceApp:
def __init__(self):
self.root = Tk()
self.root.geometry("1000x500")
self.update_interface_periodically()
def update_interface(self):
self.my_frame= Frame(self.root, bg="red")
self.my_frame.place(x=0, y=0, relwidth=1, relheight=1)
self.my_button = Button(self.my_frame)
self.my_button.place(x=0, y=0, width=50, height=50)
def update_interface_periodically(self):
self.update_interface()
self.root.after(25, self.update_interface_periodically)
app = DynamicInterfaceApp()
app.root.mainloop()
2 Antworten
Das passiert aber andauernd, weswegen es besser ist, einfach laufend die GUI zu aktualisieren.
Bei einem Kartenspiel ändert sich der Zustand des Spielbretts je Zug. Also nicht in regelmäßigen Zeitintervallen im Millisekundenbereich.
Gibt es dafür noch eine andere Methode (Zum Beispiel PyGame anwenden)?
Für ein Kartenspiel wird tkinter ausreichen. Für Spiele, die tatsächlich durchgehend ihre Oberfläche ändern müssen (z.B. bei einem Jump 'n' Run) wäre es hingegen besser, dafür angepasstere Tools (Panda3D, PyGame, Ursina, Godot mit der Python-ähnlichen Skriptsprache GDScript) zu verwenden.
Das wäre immernoch eine Spielmechanik, bei der sich die Spieloberfläche nur nach einer Aktion (z.B. Mausklick) ändern muss. Für so ein Spiel möchtest du allerdings sicherlich noch Animationen (z.B. Slideeffekte beim Bewegen von Karten), o.ä. einbauen. Da ist es lohnenswerter, eine der genannten Game-Engines/Bibliotheken zu nutzen.
Du wirfst 40 Mal pro Sekunde die ganze GUI weg und baust sie von Null an neu auf. Um das zu toppen, müsstest Du dabei jedes mal den Rechner neu starten!
Lege die Objekte einmalig an und führe periodisch nur self.my_frame.update() aus.
Danke erstmal für deine Antwort.
Nein, es ändert sich nicht pro Zug.
Bei dem Spiel handelt es sich um Dominion.
Es können innerhalb jedes einzelnen Zuges Karten genommen, gekauft, aus dem Spiel entsorgt, durch den Gegner aus der eigenen Hand entfernt werden etc.
Man kann jetzt natürlich bei jeder dieser einzelnen Aktionen in der entsprechenden Funktion hinzufügen, dass dann auch geupdated werden soll.
Aber es gibt sehr viele Ausnahmen.
Die anderen von dir vorgeschlagenen Tools werde ich mir mal anschauen.