Плагин Python Gedit с GTK, ошибка рекурсии во время выполнения фильтра хранилища дерева - PullRequest
0 голосов
/ 26 октября 2011

У меня проблема с написанием плагина gedit на python с использованием PyGTK.

Основная работа плагина состоит в том, чтобы отфильтровать хранилище дерева на основе текста, введенного в текстовой записи. Поиск - это «живой» поиск, т. Е. Нет кнопки, которую нужно нажать, поиск выполняется по событию «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 уровня, поэтому максимальная глубина равна двум.

Ну, все работает нормально, когда я набираю что-то, дерево фильтруется так, как я хочу, даже если я печатаю очень быстро, так что refilter () вызывается дважды в один и тот же момент.

Теперь проблема ... если я удаляю текст в текстовой записи (с помощью клавиши Backspace или 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, но я не могу понять, что это!

Я действительно схожу с ума !!! пожалуйста, мне нужна помощь!

Luca

1 Ответ

0 голосов
/ 26 октября 2011

Хотя у меня нет точного решения вашей проблемы, возможно, я смогу помочь вам сосредоточиться на том, что происходит не так.

Я также наткнулся на «превышение максимальной глубины рекурсии»и, как и ваш код, в коде не было рекурсии.Случилось так, что у меня был большой набор очень больших древовидных структур, содержащих некоторые данные.Код был также многообработан, так что я мог строить / работать с несколькими деревьями одновременно.Оказалось, что библиотеки python, которые имеют дело с передачей информации между процессами python, будут рекурсивно упаковывать / распаковывать эту информацию.Поэтому, когда большое дерево перешло от одного процесса к другому, я достиг «максимальной превышенной глубины рекурсии».Несмотря на то, что мой собственный код не имел рекурсии, когда древовидная структура передавалась между процессами, рекурсивный обход дерева происходил на глубину, которая превышала предел.

Решение моей проблемы состояло в том, что когда кодДостигнув этой точки обработки этих деревьев, он был вынужден работать в одном процессе, который был медленнее, но приемлемым.Также возможно увеличить максимальную глубину рекурсии, но это одно из решений типа «делай на свой страх и риск».Я бы порекомендовал прочитать об этом, прежде чем делать это.Я считаю, что глубина по умолчанию равна 1000, но вы можете отрегулировать ее следующим образом:

import sys
sys.setrecursionlimit(new_number)
...