我有一個問題,使用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引發的一些事件,但我真的不明白哪個是!
我真的很瘋狂!請我需要幫助!
盧卡
非常感謝極光!以及我已經考慮到改變遞歸限制,但我仍然沒有嘗試過(我很害怕:D)。 無論如何,關於你的問題,它似乎與我的不同,因爲我沒有任何額外的線程(但我不知道gtk是否在處理信號時創建任何線程)......順便說一句,只使用一個線程在你的代碼中,錯誤不會發生? 我正在考慮使用計時器,所以'實時搜索'不會在每次按鍵壓力後突然啓動,但在線程類中的Timer似乎對我的目的來說很蹩腳...... –
請記住,threads!= processes ,而且這個問題在多個進程中發生。一個進程幾乎就像一個單獨的程序一樣運行,而在一個進程中可以有多個線程。 – Aurora
嗯,我已經弄清楚在哪個場合發生錯誤...對我來說很奇怪: 實時搜索開始於輸入TextEntry,並且僅當我輸入內容並刪除時纔在搜索功能中出現錯誤所有的字符,但一個,退格...即, 查詢長度= 1,最後一個鍵被按下='BackSpace' –