2011-10-26 13 views
0

PyGTKを使用してPythonでgeditプラグインを作成する際に問題があります。Python Geditプラグイン、GTK、ツリーストアフィルタランタイム再帰エラー

プラグインの基本的な仕事は、テキストエントリに入力されたテキストを基にしたツリーストアをフィルタリングすることです。検索は、ツリーフィルターの)メソッド.refilter(によって処理される「ライブ」の検索、つまり、押す一切のボタンがない、検索がイベントで行われる「key_release_event」です:

widget.connect('key_release_event', self.on_type_search_box_mask) 
その側で

、ツリーは機能によってフィルタリングされています

treeFilter.set_visible_func(self.search_in_reference, None) 

今すぐ木はかなり大きさであることに注意してください、私は10-20(行の1-2数千人が、ちょうど1レベルとわずか数の行を持っています)は1レベルの子を持つため、最大深度は2です。

私は非常に速く入力しても、何かをタイプしてツリーをフィルタリングすると、すべてがうまく動作するので、refilter()が同じ瞬間に2回呼び出されます。

は、今の問題は...私は(バックスペースを持つか、デルボタン付き)テキスト入力中のテキストを削除した場合、私は、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 

バックスペースやデルボタンで突然エラーが出ることはありませんが、ある圧力(7-15)の後に、それらのボタンをもっと早く押しても圧力が必要になります!プラグインが動作しますが、いくつかの問題を続行し、エラーの後

:お子様連れの行は、数回複製され、フィルタリング機能がうまく動作しません...

今、あなたはちょうど私が持っていることを私に伝えることができますいくつかの再帰問題...しかし、素敵な話は私はコード内の任意の再帰を持っていないということです! 2つのボタンdelとbackspaceによってトリガされるイベントがあるかもしれませんが、本当に理解できません。

私は本当にクレイジーになっています!私は助けが必要です!

ルカ

答えて

0

私はあなたの問題の厳密解を持ちませんが、私はあなたが間違っている何が起こっているかに焦点を当てる助けることができるかもしれません。

私は「最大再帰深度を超えました」と遭遇しました。あなたのコードのように、コード内のどこにも再帰はありませんでした。何が起こったのかというと、いくつかのデータを保持する非常に大きな木構造の大きなセットがあったということでした。コードは複数処理されていましたので、複数のツリーを同時に構築/使用できるようになりました。 pythonプロセス間で情報をやりとりするPythonライブラリが、その情報を再帰的にパック/アンパックすることが判明しました。だから、大規模なツリーがあるプロセスから別のプロセスに渡されたときに、「最大再帰深度を超えました」とヒットしました。私のコードには再帰がありませんでしたが、プロセス間でツリー構造が渡されたとき、ツリーの再帰的なトラバーサルが限界を超えた深さまで発生しました。

私の問題の解決策は、コードがこれらのツリーを処理するこのポイントに達したときに、より遅いが許容できる単一のプロセスで実行することでした。最大再帰深度を増やすことも可能ですが、それは「自分のリスクで行う」種類の解決策の1つです。私は実際にそれを行う前にそれを読んでお勧めします。私はデフォルトの深度が1000だと信じていますが、次のように調整することができます:

import sys 
sys.setrecursionlimit(new_number) 
+0

多くのありがとうaurora !!私はすでに再帰制限を変更するために考慮に入れましたが、まだ試していませんでした(私は恐れました:D)。 とにかくあなたの問題については、私は別のスレッドを持っていないので、私とは違うように思えます(しかしgtkが信号を処理するときに何かを作成するかどうかはわかりません)...ところで、あなたのコードでは、エラーは発生しません? 私はタイマーを使うことを考えていたので、それぞれの重要な圧力の後に 'ライブ検索'が突然開始しませんでしたが、スレッディングクラスのタイマーは私の目的のためにかなりうそつきそうです... –

+0

スレッドを覚えています=この問題は、複数のプロセスで私のために発生しました。プロセスは、実行中の別のプログラムとほとんど同じですが、単一のプロセス内に多くのスレッドを持つことができます。 – Aurora

+0

まあ、間違いが起こったのは...私にとっては非常に奇妙です: ライブ検索はTextEntryで入力すると始まり、何かを入力して削除すると検索機能でエラーが発生しますバックスペースを持つすべての文字ですが、 クエリの長​​さ= 1と最後のキーが押された= 'BackSpace' –