Python Gtk+3 TextView应用程序崩溃
我有一个使用GtkTextView和GtkTextBuffer的应用程序。使用以下python代码将行添加到缓冲区,这些代码在主进程的单独线程中运行: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
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)