gtk文本itters的问题

时间:2011-02-08 00:26:11

标签: python gtk pygtk gtk-textbuffer

我有一个应用程序,我正在使用gtk在python中编写,我希望它自动关闭括号'并将光标放在它们之间问题是我随机得到以下错误并导致程序崩溃:

    ./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))

有谁能告诉我如何修复此错误?我找不到任何其他方法将光标放在括号'

之间的特定位置

1 个答案:

答案 0 :(得分: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 +文本小部件。可能有一种更容易/更优雅的方式来做同样的事情,但是这个可以完成这项工作。)