Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Gtk+3 TextView应用程序崩溃_Python_Gtk_Gtktextview - Fatal编程技术网

Python Gtk+3 TextView应用程序崩溃

Python Gtk+3 TextView应用程序崩溃,python,gtk,gtktextview,Python,Gtk,Gtktextview,我有一个使用GtkTextView和GtkTextBuffer的应用程序。使用以下python代码将行添加到缓冲区,这些代码在主进程的单独线程中运行: while True: if aLogQueue.qsize() > 0: aBuffer = aLogTextView.get_buffer() try: newLogMessage = aLogQueue.get_nowai

我有一个使用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:ERROR:gtktextview.c:4328:Gtk_text_view_validate_屏幕上: 断言失败:priv->onscreen\u已验证

请注意,我在第0行插入,因此迭代器被insert调用破坏的事实应该没有任何影响

它在失败之前写20到200行。它似乎与注销文本缓冲区的边缘无关,滚动条会在需要时出现


有什么建议吗?

您不能从单独的线程访问GtkTextBuffer或GTK+的任何部分。您必须从GUI线程访问它。您需要使用GLib.idle\u add将GUI线程上的缓冲区更新排队。

您不能从单独的线程访问GtkTextBuffer或GTK+的任何部分。您必须从GUI线程访问它。您需要使用GLib.idle\u add将GUI线程上的缓冲区更新排队。

我对为GLib找到的文档感到困惑,因为GLib.idle\u add不接受超时

但在没有超时的情况下,我使用的是Python2.7.12和GTK3.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找到的文档弄糊涂了,因为GLib.idle\u add不接受超时

但在没有超时的情况下,我使用的是Python2.7.12和GTK3.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)
然后,您可以使用以下选项设置新文本:

其他信息:

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


谢谢,但我需要更多的信息。我有下面的方法,它在GTK的一个单独的线程中运行。谢谢RBT,但我需要更多的信息。我有以下方法,它在GTK的一个单独线程中运行。
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)