我有一个应用程序,我正在使用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))
有谁能告诉我如何修复此错误?我找不到任何其他方法将光标放在括号'
之间的特定位置答案 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 +文本小部件。可能有一种更容易/更优雅的方式来做同样的事情,但是这个可以完成这项工作。)