2017-05-24 56 views
0

在我的追求,學習Python和Tkinter的,我有時候發現這樣的模式,這是我剛剛從一本書中提取的Tkinter的:遞歸tkinter調用的限制是什麼?

def manage_periodic_updates_during_play(self): 
    self.update_clock() 
    self.update_seek_bar() 
    self.root.after(1000, self.manage_periodic_updates_during_play) 

我明白,這是重複一些步驟的方法一個遞歸的方式,在指定的時間之後,我甚至在一個項目中使用這種模式。但是我想知道這個遞歸調用的次數是否有限制。我的意思是,Python可能會保留一些有關哪個函數或方法稱爲wich的參考。所以,也許在幾百或幾千個週期中,我們可以達到這個極限。

這樣的情況下,我們應該考慮這樣的限制嗎?如果是這樣,那麼這將被認爲是一種好的做法?我們如何知道將允許多少次遞歸調用,以及如何避免應用程序無響應或返回一些錯誤?

回答

2

使用這種方式後不是遞歸。你只是把工作推到隊列中。沒有限制,因爲您只將一個項目添加到從隊列中拉出的每個項目的隊列中。假設這是你做這件事的唯一地方,而且你只開始一次,那麼隊列永遠不會比一個長。

1

這樣做沒有限制 - 它不太「遞歸」 - 每次函數運行時,您只需創建一個單一事件即可調用相同的函數。

如果函數直接實際調用自己,而不是使用Tkinter(ir其他框架)事件系統進行調度 - 那麼您將被限制爲cPython的默認遞歸限制,即1000次調用。 但是通過這種方式,在呼叫root.after解決之後,yoru functina實際上結束了(並返回一個隱含的「None」) - 它是tkinter事件循環,它將對其進行下一次調用,而不是函數本身。