2017-07-18 3 views
1

Ich versuche, einen Timer zu erstellen, der die Tkinter GUI jede Sekunde aktualisiert, aber weder Zeit noch tk.after sind tatsächlich zu verzögern die Zeit, die mein Programm zum Absturz brachte. Ich verwende diesen Timer, um meine Widgets im Hauptthread zu aktualisieren, während ein anderer Worker-Prozess einen Test ausführt. Hier ist, was ich versucht (relevant nur Teile):Tkinter: Erstellen async Timer, aber sowohl Zeit und tk.after funktionieren nicht, was zu Endlosschleife

import time 
import threading 
from Tkinter import * 

class View(Frame): 
    def __init__(self, top): 
     Frame.__init__(self, top) 
     self.top = top 
     self.async_update_thread = threading.Thread(target=self.async_update, args=(self.top,)) 
     self.async_update_thread.start() 

    def async_update(self, top): 
     top.update() 
     top.after(1000, self.async_update(top)) 
     ''' 
     while True: 
      top.update() 
      time.sleep(1) 
     ''' 

if (__name__ == '__main__'): 
    top = Tk() 
    top.geometry("1250x750") 
    View(top) 
    top.mainloop() 

Dieser Code führt zu dem folgenden Fehler:

TclError: out of stack space (infinite loop?) 

Wie soll ich diesen Fehler behandeln, die meine Delay-Einstellungen zu ignorieren scheint?

Antwort

1

diesen Code vor:

top.after(1000, self.async_update(top)) 

Es ist genau das gleiche wie dieser Code:

result = self.async_update(top) 
top.after(1000, result) 

das Problem? after erfordert eine aufrufbar. Stattdessen rufen Sie die Funktion sofort auf.

Der richtige Weg after zu nennen, ist wie folgt:

top.after(1000, self.async_update, top) 
+0

Das ist ein sehr guter Punkt ist, und ich kann nicht glauben, dass ich das vermisst! Wenn es jedoch den richtigen Weg aufruft, tritt derselbe Fehler immer noch auf. Ich hätte dieses Problem auch nicht mit der Funktion time.sleep gehabt. Aus irgendeinem Grund gibt es keine Verzögerung. Ist das, weil ich Tkinter-Funktionen auf einem anderen Thread ausführen, da Tkinter für Multithreading sehr schlecht ist? – cl12

+0

@ cl12: Wenn Code in einem separaten Thread versucht, mit einem Widget zu interagieren, besteht die Möglichkeit, dass das Programm abstürzt. Alle Interaktion mit tkinter muss im selben Thread sein. –

Verwandte Themen