Skip to main content
 首页 » 编程设计

python之Gtk +3 TextView 应用程序崩溃

2025年05月04日27me-sa

我有一个使用 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_onscreen: assertion failed: (priv->onscreen_validated)

请注意,我在第 0 行插入,因此迭代器被插入调用销毁这一事实应该没有任何影响。

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

有什么建议吗?

请您参考如下方法:

您不能从单独的线程访问 GtkTextBuffer — 或 GTK+ 的任何部分,就此而言。您必须从 GUI 线程访问它。您将需要使用 GLib.idle_add() 在 GUI 线程上对缓冲区更新进行排队。