【问题标题】:wxpython TextCtrl segmentation fault on SetValueSetValue 上的 wxpython TextCtrl 分段错误
【发布时间】: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 自 创建了迭代器。您必须使用标记、字符编号或线条 数字以在缓冲区修改中保留位置。你可以 在不使迭代器无效的情况下应用标签和插入标记,但是 任何影响“可索引”缓冲区内容的突变(内容 可以通过字符偏移量引用)将使所有 优秀的迭代器分段错误

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    我不相信从线程内更新会正常工作。
    应使用主 GUI 循环执行更新。
    我不知道这是否与gtk有关:Gtk +3 TextView application crashes

    您可以通过 pubsub 尝试更新,您自己的某些设备使用变量或使用 wx.Timer 而不是线程,即

    import wx
    import time
    
    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(None)
            self.timer = wx.Timer(self)
            self.Bind(wx.EVT_TIMER, self.update_text, self.timer)
            self.timer.Start(5000)
    
        def update_text(self, event):
            print("update_text")
            self.text_ctrl_1.Clear()
            wx.GetApp().Yield() # to see the clear occur release momentarily to the main loop
            try:
                with open("test.txt", "r") as f:
                   text = f.read()
            except:
                print(_('Error opening test.txt file!'))
                text = _('Error opening test.txt file!')
            time.sleep(2)
            self.text_ctrl_1.SetValue(text)
    
        def __set_properties(self):
            self.SetTitle("My 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__":
        app = MyApp()
        app.MainLoop()
    

    【讨论】:

    • 谢谢,我想你遇到了问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多