2011-02-08 8 views
1

私はgtkを使ってPythonで書いているアプリケーションを持っていて、自動的に括弧を閉じてそれらの間にカーソルを置いて欲しいです。問題はランダムに次のエラーが出てきて、プログラムのクラッシュ:gtkテキストの問題itter

./mbc.py:266: GtkWarning: Invalid text buffer iterator: either the iterator is 
uninitialized, or the characters/pixbufs/widgets in the buffer have been modified since 
the iterator was created. 
    You must use marks, character numbers, or line numbers to preserve a position across 
buffer modifications. 
    You can apply tags and insert marks without invalidating your iterators, 
    but any mutation that affects 'indexable' buffer contents (contents that can be 
referred to by character offset) 
    will invalidate all outstanding iterators 
     buff.place_cursor(buff.get_iter_at_line_offset(itter.get_line(),Iter.get_offset()-1)) 
    ./mbc.py:266: GtkWarning: gtktextbtree.c:4094: char offset off the end of the line 
     buff.place_cursor(buff.get_iter_at_line_offset(itter.get_line(),Iter.get_offset()-1)) 

    Gtk-ERROR **: Char offset 568 is off the end of the line 
    aborting... 
    Aborted 

そのエリアの周りのコードはこれです:

def insert_text(self, buff, itter, text, length): 
    if text == '(': 
     buff.insert_at_cursor('()') 
     mark = buff.get_mark('insert') 
     Iter = buff.get_iter_at_mark(mark) 
     buff.place_cursor(buff.get_iter_at_line_offset(itter.get_line(),Iter.get_offset()-1)) 

誰がどのようにこのエラーを修正する教えてもらえますか?括弧の間にカーソルを置くための他のfmメソッドは見つかりません。 '

答えて

1

insert_at_cursor呼び出しは、関数に渡されたイテレータを無効にします。最後の行でそのイテレーターを参照すると、GTK +は警告を表示します。この動作はGTK+ Text Widget Overviewで説明されています。これを修正

は、たとえば、イテレータを再使用しないの問題である:

buff.insert_at_cursor(')') # This invalidates existing iterators. 
mark = buff.get_mark('insert') 
iter = buff.get_iter_at_mark(mark) # New iterator 
iter.backward_cursor_positions(1) 
buff.place_cursor(iter) 

(免責事項:私は長い時間でGTK +テキストウィジェットを使用していないが、 簡単にはおそらくあります/同じことをするもっとエレガントな方法ですが、これは仕事です)

関連する問題