在Tkinter中递归使用root.after()的方法

时间:2013-09-28 17:08:43

标签: python tkinter

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

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

2 个答案:

答案 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 "