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)
将 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)