2013-09-28 44 views
0

在Tkinter中,我使用root.after()根據函數返回值創建線程並更新GUI標籤。我想遞歸地使用相同的函數,並根據函數的返回值的更新來更新標籤。在Tkinter中遞歸使用root.after()的方式

但是,似乎線程只調用一次函數並終止。我如何讓我的線程遞歸調用函數?這裏是打印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

就使的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

這裏需要注意的一點是,非常小心小心你如何實現這一點。 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 "