簡體   English   中英

帶有GTK的Python Gedit插件,樹存儲過濾器運行時遞歸錯誤

[英]Python Gedit plugin with GTK, tree store filter runtime recursion error

我在使用PyGTK在python中編寫gedit插件時遇到問題。

插件的基本工作是根據文本輸入中鍵入的文本來過濾樹存儲。 搜索是“實時”搜索,也就是說,沒有要按的按鈕,搜索是在事件“ key_release_event”上執行的,該事件由樹過濾器的.refilter()方法處理:

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層子級,因此最大深度為2。

好了,一切都很好,當我鍵入某些內容時,即使我鍵入得很快,也可以根據需要過濾樹,因此refilter()同時被調用兩次。

現在的問題是...如果我刪除文本條目中的文本(使用退格鍵或del按鈕),則通過python收到以下錯誤,重復了很多次:

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

使用Backspace或del按鈕不會突然出現該錯誤,但是在施加一定的壓力(7-15)之后,如果我更快地按下這些按鈕,也就需要更少的壓力了!

發生錯誤后,插件繼續工作,但存在一些問題:帶有子項的行已重復多次,並且過濾功能無法正常工作...

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

我真的瘋了!!! 請我需要幫助!

路卡

盡管我無法為您的問題提供確切的解決方案,但我也許可以幫助您專注於問題所在。

我也偶然發現“超出了最大遞歸深度”,並且像您的代碼一樣,代碼中的任何地方都沒有遞歸。 發生的事情是,我有一大堆非常大的樹狀結構,其中包含一些數據。 該代碼也經過多處理,因此我可以同時構建/使用多棵樹。 事實證明,處理在python進程之間來回傳遞信息的python庫將遞歸打包/解壓縮該信息。 因此,當一棵大樹從一個過程傳遞到另一個過程時,我達到了“超出最大遞歸深度”。 即使我自己的代碼沒有遞歸,當在進程之間傳遞樹結構時,樹的遞歸遍歷也會發生到超出限制的深度。

我的問題的解決方案是,當代碼到達處理這些樹的位置時,它被迫在單個進程中運行,這雖然速度較慢但可以接受。 也可以增加最大遞歸深度,但這是“自擔風險”這類解決方案之一。 我建議在實際操作之前先閱讀它。 我相信默認深度為1000-但您可以使用以下方法進行調整:

import sys
sys.setrecursionlimit(new_number)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM