【问题标题】:wx.DestroyChildren in event handler cause segmentation fault on osx事件处理程序中的 wx.DestroyChildren 导致 osx 上的分段错误
【发布时间】:2014-03-24 10:44:07
【问题描述】:

以下 Python 代码在 Windows 上运行良好,但在 奥斯克斯。任何建议为什么?使用 CallAfter 并没有什么不同...

import wx

class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(wx.StaticText(self, -1, 'Static text'))
        self.sizer.Add(wx.Button(self, -1, 'Button'))
        self.SetSizer(self.sizer)
        self.Bind(wx.EVT_BUTTON, self.on_button)

    def on_button(self, event):
        self.sizer.Clear()
        self.DestroyChildren()

app = wx.App()
frame = myFrame()
frame.Show()
app.MainLoop()

【问题讨论】:

  • 您是否尝试过找出导致段错误的行?
  • 是的,是 DestroyChildren。也尝试了 wx.CallAfter(self.DestroyChildren),结果相同。

标签: python macos segmentation-fault wxpython


【解决方案1】:

这是因为对于被破坏的小部件仍有待处理的系统消息(在这种情况下是鼠标移动)以及从事件处理程序返回后运行的代码将尝试使用被破坏的小部件的可能性(调用方法或访问属性。)

使用CallAfter来延迟销毁确实解决了我的问题,你使用的是哪个版本的wxPython?如果这对您不起作用,那么您可能想尝试使用 wx.CallLater 来代替,使用较小的超时值。

import wx 

class myFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None) 
        self.sizer = wx.BoxSizer(wx.VERTICAL) 
        self.sizer.Add(wx.StaticText(self, -1, 'Static text')) 
        self.sizer.Add(wx.Button(self, -1, 'Button')) 
        self.SetSizer(self.sizer) 
        self.Bind(wx.EVT_BUTTON, self.on_button) 

    def on_button(self, event): 
        wx.CallAfter(self.doit)

    def doit(self):
        self.sizer.Clear() 
        self.DestroyChildren() 

app = wx.App() 
frame = myFrame() 
frame.Show() 
app.MainLoop() 

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2019-07-05
    • 2020-10-23
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多