2017-02-23 4 views
0

Ich entwickelte eine einfache Python-Anwendung, die einige Sachen machte, dann entschied ich mich, eine einfache GUI mit Tkinter hinzuzufügen.Wie kann man Tkinter-Einfrieren leicht vermeiden?

Das Problem ist, dass, während die Hauptfunktion ihre Sachen macht, das Fenster einfriert.

Ich weiß, es ist ein häufiges Problem und ich habe bereits gelesen, dass ich Multithreads verwenden sollte (sehr kompliziert, weil die Funktion die GUI auch aktualisiert) oder meinen Code in verschiedene Funktionen aufteilen, die jeweils für eine kurze Zeit funktionieren. Wie auch immer, ich möchte meinen Code für solch eine dumme Anwendung nicht ändern.

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

ich es eine Pseudocodebeispiel unter dem gebe ich versucht, aber hat 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 refresh ausführen nur einmal, und ich kann nicht verstehen, warum.

Vielen Dank für Ihre Hilfe.

+0

Sie können nicht erwarten, dass Ihr Programm 'self.refresh' jede Sekunde ausführt, während es' doingALotOfStuff() 'beschäftigt. Ich denke nicht, dass du Multithreading bewältigen wirst. –

+0

Ich habe es. Es erscheint mir einfach verrückt, dass es keine einfache Lösung gibt, solch eine einfache Software zu machen ... Vielleicht zeigt uns jemand einen Trick! – decadenza

Antwort

1

Tkinter ist in mainloop. Was im Grunde bedeutet, dass es das Fenster ständig aktualisiert, auf Schaltflächen klickt, auf Wörter tippt, auf Callbacks usw. Wenn Sie Code auf demselben Thread ausführen, der mainloop aktiviert ist, wird nichts anderes auf der mainloop ausgeführt werden bis dieser Codeabschnitt fertig ist. Eine sehr einfache Problemumgehung führt zu einem langen laufenden Prozess in einem separaten Thread. Dies wird weiterhin in der Lage sein, mit Tkinter zu kommunizieren und seine GUI (größtenteils) zu aktualisieren.

Hier ist ein einfaches Beispiel, das nicht drastisch Ihre Pseudo-Code ändern wird:

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() 

This Antwort in einigen Details geht auf mainloop und wie es blockiert Ihren Code.

Here's ein anderer Ansatz, der über das Starten der GUI auf seinem eigenen Thread hinausgeht und danach anderen Code ausführt.

+0

Vielen Dank, ich schätze Ihre Hilfe. Ich denke, das Hauptproblem liegt an der Tatsache, dass die Funktion doingOTofStull() die GUI auch aktualisiert ... Ich denke, hier gibt es keine intelligente Lösung. Ich muss Multithreading lernen oder die GUI überhaupt meiden ... – decadenza

Verwandte Themen