【发布时间】:2020-04-23 08:01:44
【问题描述】:
我正在用 wxglade 构建一个小应用程序。
它基本上只是一个 TextCtrl 多行且只读。 我启动一个线程来读取文件并将内容显示到 TextCtrl 中。 经过一堆执行后,我得到了一个分段错误。
Debian 9 Python 3.5.3 wxpython 4.0.7.post2
有什么建议吗? 非常感谢!
代码
import wx, threading, pdb
import gettext
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.SetSize((400, 300))
self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_READONLY)
self.__set_properties()
self.__do_layout()
self.update_text()
def update_text(self):
print("update_text")
text = ""
try:
f = open("test.txt", "r")
text = f.read()
f.close()
except:
print(_('Error opening test.txt file!'))
text = _('Error opening test.txt file!')
self.text_ctrl_1.SetValue(text)
threading.Timer(1, self.update_text).start()
def __set_properties(self):
self.SetTitle(_("frame"))
def __do_layout(self):
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_1.Add(self.text_ctrl_1, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
self.Layout()
class MyApp(wx.App):
def OnInit(self):
self.frame = MyFrame(None, wx.ID_ANY, "")
self.SetTopWindow(self.frame)
self.frame.Show()
return True
if __name__ == "__main__":
gettext.install("app") # replace with the appropriate catalog name
app = MyApp(0)
app.MainLoop()
错误
更新文本 更新文本 更新文本 更新文本
(wxglade_out.py:5127): Gtk-WARNING **: 无效的文本缓冲区迭代器: 要么迭代器未初始化,要么 缓冲区中的字符/pixbufs/widgets 自 创建了迭代器。您必须使用标记、字符编号或线条 数字以在缓冲区修改中保留位置。你可以 在不使迭代器无效的情况下应用标签和插入标记,但是 任何影响“可索引”缓冲区内容的突变(内容 可以通过字符偏移量引用)将使所有 优秀的迭代器
(wxglade_out.py:5127): Gtk-WARNING **: 无效的文本缓冲区迭代器: 要么迭代器未初始化,要么 缓冲区中的字符/pixbufs/widgets 自 创建了迭代器。您必须使用标记、字符编号或线条 数字以在缓冲区修改中保留位置。你可以 在不使迭代器无效的情况下应用标签和插入标记,但是 任何影响“可索引”缓冲区内容的突变(内容 可以通过字符偏移量引用)将使所有 优秀的迭代器分段错误
【问题讨论】: