0

在 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 "

任何帮助将不胜感激。谢谢

4

2 回答 2

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)

希望这可以帮助!

于 2014-04-21T00:58:57.373 回答
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 "
于 2014-04-21T18:36:37.047 回答