2016-06-13 102 views
0

我有一个应用程序使用GtkTextView和GtkTextBuffer。行被添加到缓冲用它运行在从主处理一个单独的线程以下Python代码: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 +的任何部分。您必须从GUI线程访问它。您将需要使用GLib.idle_add()在GUI线程上排队缓冲区更新。