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.

  • Auswählen einer Datei in Python mit einfachem Dialog [geschlossen]
  • Gibt es eine Möglichkeit, Tabs eines Notebooks untereinander zu setzen?
  • Pyinstaller: erzeugen -exe file + folder (in -onefile mode)
  • Python GUI (Glade) zur Anzeige der Ausgabe des Shell-Prozesses
  • Eine GUI zum Sortieren: wie man bestimmte Zahlen in jedem Schritt der Sortierung färbt?
  • Pyqt Zeichnung auf einem exsiting Widget von GUI
  • Greifen Sie einen Rahmen aus, nachdem Sie auf einen Radiobutton Tkinter geklickt haben
  • Machen Sie Ihr Programm USE eine Gui
  • Hat Tkinter eine Auffrischungsmethode?
  • Öffnen Sie das Fenster und fokussieren Sie das Textfeld tkinter
  • WxPython Popup vom Aufruf der importierten Funktion
  • Python ist die beste Programmiersprache der Welt.