Проблемы с текстовыми сообщениями gtk - PullRequest
1 голос
/ 08 февраля 2011

У меня есть приложение, которое я пишу на 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 Ответ

1 голос
/ 08 февраля 2011

Вызов 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 + долгое время. Вероятно, есть более простой / более элегантный способ сделать то же самое, но этот делает свою работу.)

...