Gtk +3 TextView应用程序崩溃

时间:2016-06-13 01:43:23

标签: python gtk gtktextview

我有一个使用GtkTextView和GtkTextBuffer的应用程序。使用以下python代码将行添加到缓冲区中,该代码在与主进程分开的线程中运行:

    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:错误:gtktextview.c:4328:gtk_text_view_validate_onscreen:   断言失败:(priv-> onscreen_validated)

请注意,我在第0行插入,因此插入调用销毁迭代器的事实应该没有效果。

在失败之前写入20到200行。它似乎与写下文本缓冲区的边缘无关,并且在预期时会出现滚动条。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

您无法从单独的线程访问GtkTextBuffer或GTK +的任何部分。您必须从GUI线程访问它。您需要使用GLib.idle_add()在GUI线程上对缓冲区更新进行排队。

答案 1 :(得分:0)

我对我为GLib找到的文档感到困惑,因为GLib.idle_add不接受超时。 http://lazka.github.io/pgi-docs/index.html#GLib-2.0/functions.html#GLib.idle_add

但是没有超时,它对我使用Python 2.7.12和Gtk 3.20

为文字插入创建功能

   def set_text(self, text):
    textbuffer = self.textview.get_buffer()
    textbuffer.set_text(text, len(text))

   def append_text(self, text:
    oldtext = self.get_text()
    newtext = "{}\n{}".format(oldtext, text)
    self.set_text(newtext)

然后您可以设置新文字

GLib.idle_add(self.textbox.append_text, "I am the new text line)  

其他信息:

在脚本运行时,我还检查按钮的灵敏度

def on_search_button_clicked(self, widget)
    widget.set_sensitive(False)
    thread = Thread(target=self.run_search_script)
    thread.start()
    GObject.timeout_add(200, self.sensi, thread, widget)

def sensi(self, thread, widget):
    return True if thread.is_alive() else widget.set_sensitive(True)