Python3 给出:GtkTextBuffer 核心转储

Python3 gi: GtkTextBuffer core dump

将 Python3 与 gi.repository.Gtk 结合使用,我试图通过 GtkTextBuffer.

GtkTextView 中显示多个文本行

基本上,我使用 _addLine 方法动态添加行,该方法以这种方式更新文本缓冲区(self._lines 是一个数组,self._textBuffer 是一个 GtkTextBuffer):

def _addLine(self, text):
    if len(self._lines) == self._maxLines:
        self._lines = self._lines[1:]
    self._lines.append(text)
    content = '\n'.join(self._lines)
    print("TIC: %d" % len(content))
    self._textBuffer.set_text(content)
    print("TAC")

不幸的是,在 i 的随机值(小于或大于 self._maxLines),我在 "TIC" 和 "TAC" 之间随机得到一个核心转储,所以当我尝试设置缓冲区的内容。

此方法由线程调用,他自己从构造函数中调用(在初始化所有 GUI 元素之后):

def _startUpdateThread(self):
    thread = threading.Thread(target=lambda: self._updateLoop())
    thread.daemon = True
    thread.start()

def _updateLoop(self):
    i=0
    for l in listings.tail(self._logFile, follow=True, n=1000):
        i+=1
        print("i=%d, nLines=%d" % (i, len(self._lines)))
        self._addLine(l)

我正在使用结构如下的 Glade 构建器:

GtkWindow
  - GtkVBox
      - GtkScrolledWindow
          - GtkTextView (linked to GtkTextBuffer)
  - GtkButton (to close the window)
  - GtkTextBuffer

我做错了什么?该核心转储的原因是什么?

非常感谢您的帮助。

当您从线程而不是 GTK 主循环修改小部件时,您应该使用 GLib.idle_add()

在这种情况下:

GLib.idle_add(self._textBuffer.set_text, content)