2011-10-26 33 views
0

我有一個問題,使用PyGTK在python中編寫gedit插件。GTK的Python Gedit插件,樹存儲過濾器運行時遞歸錯誤

該插件的基本工作是過濾基於輸入文本條目中的文本的樹存儲。該搜索是一種「活」搜索,即,不存在按鈕按下時,在其上由該方法.refilter()樹濾波器的處理的事件「key_release_event」執行搜索:

widget.connect('key_release_event', self.on_type_search_box_mask) 

在其一側,樹是由功能過濾:

treeFilter.set_visible_func(self.search_in_reference, None) 

現在注意,樹是相當大的,我有1-2幾千行,但僅有1平,就幾行(10-20 )有1個等級的孩子,所以最大深度是兩個。

那麼一切正常,當我鍵入的東西樹被過濾,因爲我想要的,即使我輸入非常快,以便refilter()被調用兩次在同一時刻。

現在的問題......如果我刪除文本輸入文本(與退格或刪除按鈕),我收到由蟒蛇以下錯誤,重複了很多次:

Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <type 'exceptions.RuntimeError'> ignored 
Exception RuntimeError: 'maximum recursion depth exceeded while calling a Python object' in <type 'exceptions.RuntimeError'> ignored 
Error in sys.excepthook: 
RuntimeError: maximum recursion depth exceeded 

Original exception was: 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

的錯誤不會隨退格鍵或del鍵突然出現,但經過一些壓力(7-15)後,如果我更快地按下這些按鈕,也需要更少的壓力!

插件延續了錯誤後工作,但有一些問題:有孩子的行已經重複多次和過濾功能不能很好地工作......

現在你可以告訴我,我有一些遞歸問題......但好的故事是,我沒有在代碼中的任何地方遞歸! 也許是由兩個按鈕del和backspace引發的一些事件,但我真的不明白哪個是!

我真的很瘋狂!請我需要幫助!

盧卡

回答

0

雖然我沒有你的問題的精確解,我也許能幫助你聚焦於什麼錯誤。

我也偶然發現了'超出最大遞歸深度',並且和你的代碼一樣,代碼中的任何地方都沒有遞歸。發生了什麼事情是我有一大堆擁有一些數據的非常大的樹結構。代碼也是多處理的,所以我可以同時構建/處理多個樹。 事實證明,處理在python進程之間來回傳遞信息的python庫將遞歸地打包/解壓縮這些信息。所以當一棵大樹從一個進程傳遞到另一個進程時,我碰到了'超過最大遞歸深度'。即使我自己的代碼沒有遞歸,當樹結構在進程之間傳遞時,樹的遞歸遍歷發生到超出限制的深度。

我的問題的解決方案是,當代碼達到處理這些樹的這一點時,它被迫在單個進程中運行,這是慢但可以接受的。也可以增加最大遞歸深度,但那是「自負風險」的解決方案之一。我建議在實際操作之前先閱讀它。我相信默認深度是1000 - 但你可以用以下方法調整它:

import sys 
sys.setrecursionlimit(new_number) 
+0

非常感謝極光!以及我已經考慮到改變遞歸限制,但我仍然沒有嘗試過(我很害怕:D)。 無論如何,關於你的問題,它似乎與我的不同,因爲我沒有任何額外的線程(但我不知道gtk是否在處理信號時創建任何線程)......順便說一句,只使用一個線程在你的代碼中,錯誤不會發生? 我正在考慮使用計時器,所以'實時搜索'不會在每次按鍵壓力後突然啓動,但在線程類中的Timer似乎對我的目的來說很蹩腳...... –

+0

請記住,threads!= processes ,而且這個問題在多個進程中發生。一個進程幾乎就像一個單獨的程序一樣運行,而在一個進程中可以有多個線程。 – Aurora

+0

嗯,我已經弄清楚在哪個場合發生錯誤...對我來說很奇怪: 實時搜索開始於輸入TextEntry,並且僅當我輸入內容並刪除時纔在搜索功能中出現錯誤所有的字符,但一個,退格...即, 查詢長度= 1,最後一個鍵被按下='BackSpace' –