在单击按钮时清除wxPython帧

在单击按钮时清除wxPython帧,wxpython,Wxpython,在Arch上使用WxPython2.8(很好,但我认为不应该…)和在MacOSX上使用WxPython2.9,两者都是Python2.7。我的代码包括根据当前状态在不同屏幕之间切换。在状态(屏幕)之间的每次切换中,我都会清除我的主Sizer并在主框架上调用DestroyChildren(),然后用其他组件填充它们 所以本质上我认为我有外部线程试图改变主线程中的wx组件。我猜这不是wxPython的最佳实践,那么我如何才能修改它呢 将事件附加到按钮 self.login_button.Bind(w

在Arch上使用WxPython2.8(很好,但我认为不应该…)和在MacOSX上使用WxPython2.9,两者都是Python2.7。我的代码包括根据当前状态在不同屏幕之间切换。在状态(屏幕)之间的每次切换中,我都会清除我的主Sizer并在主框架上调用DestroyChildren(),然后用其他组件填充它们

所以本质上我认为我有外部线程试图改变主线程中的wx组件。我猜这不是wxPython的最佳实践,那么我如何才能修改它呢

将事件附加到按钮

self.login_button.Bind(wx.EVT_BUTTON, self.login_button_click)
登录事件进行填充并调用更新(此处更改模型状态)

更新将清除框架、检查状态并调用生成器方法

def update(self, o):
    self.box.Clear() #clear the main sizer
    self.frame.DestroyChildren() #delete all children, THIS IS WHERE THE CODE SEGFAULTS


    print "STATE: "+self.model.current_state

    if self.model.current_state == self.model....
        ...
    elif self.model.current_state == self.model....
        ...

我尝试过使用wx.CallAfter,结果在事件结束时删除了所有组件,甚至是新构建的组件。

您实际使用的是线程模块还是与线程相关的任何组件?在wxPython中,您真的不需要这些工具来删除小部件。我不知道你为什么一开始就销毁所有的小部件。为什么不隐藏主框架并显示包含所有新小部件的子框架?或者使用两个面板。一个面板被破坏,另一个带有其他小部件的面板被放置到位?我有一个关于后者的例子。

我遇到的一件奇怪的事情是frame.Layout()不工作?为了使面板正确显示,我需要调整框架的大小。我正在顶层框架上调用Layout()方法。您可能需要在包含面板的sizer上调用Layout()。使用self.sizer.Layout()和self.Layout()的组合,结果相同。调用.Layout()是否会强制所有chidl元素重新布局?或者我应该试着在较低的层次上调用Layout吗?通常,您只需在顶部容器上调用它,它就会对子容器进行布局。如果您可以生成一个简单的可运行示例,那将是非常棒的!
def update(self, o):
    self.box.Clear() #clear the main sizer
    self.frame.DestroyChildren() #delete all children, THIS IS WHERE THE CODE SEGFAULTS


    print "STATE: "+self.model.current_state

    if self.model.current_state == self.model....
        ...
    elif self.model.current_state == self.model....
        ...