Wie kann man Tkinter einfrieren?

Ich habe eine einfache Python-Anwendung entwickelt, die ein paar Sachen macht, dann habe ich beschlossen, eine einfache GUI mit Tkinter hinzuzufügen.

Das Problem ist, dass, während die Hauptfunktion seine Sachen macht, das Fenster friert.

Ich weiß, es ist ein häufiges Problem und ich habe schon gelesen, dass ich Multithreads verwenden sollte (sehr kompliziert, weil die Funktion auch die GUI aktualisiert) oder meinen Code in unterschiedlicher Funktion teilen, jeder arbeitet für ein wenig Zeit. Jedenfalls möchte ich meinen Code nicht für solch eine dumme Anwendung ändern.

Meine Frage ist: Ist es möglich, gibt es keine einfache Möglichkeit, mein Tkinter-Fenster jede Sekunde zu aktualisieren? Ich möchte nur die KISS-Regel anwenden!

Ich gebe Ihnen ein Pseudocode Beispiel unten, dass ich versucht habe, aber nicht funktioniert:

class Gui: [...]#costructor and other stuff def refresh(self): self.root.update() self.root.after(1000,self.refresh) def start(self): self.refresh() doingALotOfStuff() #outside GUI = Gui(Tk()) GUI.mainloop() 

Es wird einfach nur einmal aktualisiert, und ich kann nicht verstehen, warum.

Vielen dank für Deine Hilfe.

One Solution collect form web for “Wie kann man Tkinter einfrieren?”

Tkinter ist in einem mainloop . Was im Grunde bedeutet, dass es ständig das Fenster erfrischt, wartet auf Knöpfe, um angeklickt zu werden, Wörter, die eingegeben werden sollen, laufen Rückrufe, etc. Wenn Sie einen Code auf dem gleichen Thread mainloop , den die mainloop hat, dann wird sonst nichts auf dem mainloop Bis dieser Codeabschnitt durchgeführt wird. Ein ganz einfacher Workaround ist ein langer Prozess auf einen separaten Thread. Dies wird noch in der Lage sein, mit Tkinter zu kommunizieren und seine GUI zu aktualisieren (zum größten Teil).

Hier ist ein einfaches Beispiel, das Ihren Psuedo-Code nicht drastisch ändert:

 import threading class Gui: [...]#costructor and other stuff def refresh(self): self.root.update() self.root.after(1000,self.refresh) def start(self): self.refresh() threading.Thread(target=doingALotOfStuff).start() #outside GUI = Gui(Tk()) GUI.mainloop() 

Diese Antwort geht in einige Details auf mainloop und wie es Ihren Code blockiert.

Hier ist ein weiterer Ansatz, der über den Start der GUI auf seinen eigenen Thread geht und dann läuft verschiedene Code nach.

  • So ändern Sie die Farbe von allem in einer tkinter GUI auf einmal
  • Wxpython Zeile zu TextCtrl hinzufügen
  • Kochbuch-GUI-Schnittstelle für ein Kommandozeilen-Skript
  • Mit welcher Art von IDE (wenn überhaupt) bildest du python-GUI-Projekte?
  • WxPython: Anzeige mehrerer Widgets im gleichen Frame
  • WxPython - Zeichnen eines ungefüllten Rechtecks ​​mit dem DC
  • Wie laufe ich Selen in Xvfb?
  • Öffnen Sie das Fenster und fokussieren Sie das Textfeld tkinter
  • Widgets anzeigen und verstecken
  • Wie kann ich die Ausgabe von tkFileDialog.askdirectory verwenden, um ein tkinter Entry-Feld zu füllen
  • Tkinter-Tastenbefehl aktiviert bei laufendem Programm?
  • Python ist die beste Programmiersprache der Welt.