2016-06-13 4 views
0

У меня есть приложение, использующее GtkTextView и GtkTextBuffer. Строки добавляются в буфер с помощью следующего кода питона, который работает в отдельном потоке от основного процесса:Gtk +3 Сбой приложений TextView

while True:  
     if aLogQueue.qsize() > 0: 
      aBuffer = aLogTextView.get_buffer() 
      try: 
       newLogMessage = aLogQueue.get_nowait() 
       ipri = int(newLogMessage[0])      
       if(ipri>=self.ListenLogMinPr): 
        aniter = aBuffer.get_iter_at_line(0) 
        aBuffer.insert(aniter, newLogMessage) 
        #mark = aBuffer.get_mark('insert') 
        #aniter = aBuffer.get_iter_at_mark(mark) 
        #aBuffer.place_cursor(aniter) 
       pass 
      except: 
       print('threw exception in message loop') 
       self.gui_shutdown() 

aLogQueue выстраивается очередь из одной строки ASCII текстовых сообщений.

Приложение работает на некоторое время, но затем неизменно падает со следующей ошибкой

Gtk:ERROR:gtktextview.c:4328:gtk_text_view_validate_onscreen: assertion failed: (priv->onscreen_validated)

Следует заметить, что я вставив в строке 0, поэтому тот факт, что итераторы уничтожаются при вызове вставки не должен иметь никакого эффекта ,

Он записывает от 20 до 200 строк перед сбоем. Похоже, что это не связано с записью границы текстового буфера, и полосы прокрутки появляются, когда ожидается.

Любые предложения?

+0

Спасибо RBT, но мне нужна дополнительная информация. У меня есть следующий метод, который запускается в отдельном потоке из GTK. –

ответ

3

Вы не можете получить доступ к GtkTextBuffer - или любой части GTK +, если на то пошло - из отдельного потока. Вы должны получить к нему доступ из потока графического интерфейса. Вам нужно будет использовать GLib.idle_add() для очереди обновления буфера в потоке графического интерфейса.

Смежные вопросы