[英]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.