1

大きな (> 20 MB) テキスト ファイルをナビゲートするために、PyGTK を使用してプログラムを作成しています。私はこれに TextViewer ウィジェットを使用しています。これは、対応する TextBuffer の入力を完了するのに数秒かかることを除いて、それらを非常にうまく処理します。一方、入力のフィルタリングが必要なダイアログもいくつかあります(16進数のみなど)。許可する文字とシグナルの名前をこの関数に渡します。

def FilterText(self, chars, signal):

    def Filt(entry, text, length, position):
        position = entry.get_position()
        chrs = set(chars)
        realtext = ''.join([c for c in text if c in chrs])
        if len(realtext) > 0:
            entry.handler_block_by_func(Filt)
            entry.insert_text(realtext, position)
            entry.handler_unblock_by_func(Filt)
            newPos = position + len(realtext)
            gobject.idle_add(entry.set_position, newPos)
        entry.stop_emission(signal)
    return Filt

そして、結果を Entry ウィジェットのそのシグナルのハンドラーに接続します。これは機能しますが、TextBuffer が満たされている間、キューに入れられた entry.set_position 呼び出しは終了するまで実行されません。その結果、カーソルが Entry の先頭でスタックし、入力されたすべてが逆方向になり、言うまでもなく、非常に煩わしくなります。これはおそらく、TextBuffer がいっぱいになるまでアイドル時間がないためです。これを回避して、フィルタリングされた Entry ウィジェットに入力するときに正しい動作を許可する方法はありますか? (フィルタリングされていないものではそのような問題は発生しないため、可能であるはずです) entry.set_position を直接呼び出すと、何らかの理由で機能しません。

4

1 に答える 1

1

最後にそれを理解しました-呼び出しを変更します

gobject.idle_add(entry.set_position, newPos)

gobject.timeout_add(0, entry.set_position, newPos)

entry.set_position は None を返すため、すぐに 1 回呼び出され、その後はまったく呼び出されず、まさに私が望んでいたことを行います。

于 2012-09-17T20:06:43.107 に答える