在Tkinter中,我使用root.after()根据函数返回值创建线程并更新GUI标签。我希望递归地使用相同的函数并根据函数的返回值更改标签。
但是,似乎线程只调用一次函数并终止。如何让我的线程以递归方式调用函数?这是打印getData()只两次并终止的代码。
def recusriveDataFetch( self ):
self.sched = sched.scheduler(time.time, time.sleep)
self.sched.enter(100, 2, self.getData(), ()) #create getData() event after every 100 ms
self.sched.run()
def rootWindow( self ):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.after( 1000, thread.start_new_thread, self.recusriveDataFetch, () )
self.root.mainloop()
def getData( self ):
print " When I will be called multiple times\n "
任何帮助将不胜感激。感谢
答案 0 :(得分:2)
只需让getData函数再次调用root.after方法:
def rootWindow(self):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.mainloop()
def getData(self):
print("I will be called multiple times")
self.root.after(1000, self.getData)
希望这有帮助!
答案 1 :(得分:1)
这里要注意的一点是,非常小心如何实现这一点。 Tkinter 不线程安全,我被这几次咬了。我非常喜欢GUI工具包,但你需要牢记这一点。只需确保线程内的任何内容都与Tkinter实例中的任何内容进行交互。
我如何做到这一点:
def recusriveDataFetch(self):
self.sched = sched.scheduler(time.time, time.sleep)
self.sched.enter(100, 2, self.getData(), ()) #create getData() event after every 100 ms
self.sched.run()
def dataFetchWrapper(self, repeat=True):
thread.start_new_thread(self.recusriveDataFetch)
if repeat:
self.root.after(100, self.dataFetchWrapper)
def rootWindow(self):
self.root = Tkinter.Tk()
self.root.title("Hello World")
self.getData()
self.root.after(1000, self.dataFetchWrapper)
self.root.mainloop()
def getData(self):
print " When I will be called multiple times\n "