繁体   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