gtk文本迭代器的问题

2 投票
1 回答
2135 浏览
提问于 2025-04-16 11:25

我正在用Python和GTK写一个应用程序,我希望它能自动闭合括号,并把光标放在括号之间。不过,我遇到了一个问题,程序会随机崩溃,并出现以下错误:

    ./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 个回答

2

调用 insert_at_cursor 时,会让你传入的迭代器失效。当你在最后一行再次使用这个迭代器时,GTK+ 会给你一个警告。这个行为在 GTK+ 文本小部件概述 中有解释。

解决这个问题的方法是不要重复使用那个迭代器,比如:

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+ 文本小部件了。可能有更简单或更优雅的方法来实现同样的功能,但这个方法是可以工作的。)

撰写回答