单击按钮清除wxPython框架

时间:2012-08-07 15:35:50

标签: wxpython

在Arch上使用wxPython 2.8(工作正常,但我认为不应该......)和Mac OS X上的wxPython 2.9,两者都是Python 2.7。我的代码包括根据当前状态在不同屏幕之间切换。在状态(屏幕)之间的每个开关上,我清除我的主Sizer并在我的主框架上调用DestroyChildren(),然后用其他组件填充它们。

基本上我认为我有外部线程试图在主线程中更改wx组件。我猜这不是wxPython中的最佳实践,那么我怎么能修改它?

将事件附加到按钮

self.login_button.Bind(wx.EVT_BUTTON, self.login_button_click)

登录事件会执行操作并调用更新(模型状态在此处更改)

def login_button_click(self,event):

    ...
    # CHANGE THE self.model.current_state
    ...

    self.update(None)

更新清除帧,检查状态并调用构建器方法

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,这导致在事件结束时删除了所有组件,甚至是新构建的组件。

1 个答案:

答案 0 :(得分:1)

您实际使用的是线程模块还是与线程相关的任何内容?你真的不需要那些删除wxPython中的小部件。我不确定你为什么要首先摧毁你所有的小部件。为什么不隐藏主框架并显示包含所有新窗口小部件的子框架?或者使用两个面板。一个面板被销毁,另一个面板与其他小部件放在一起?我在blog上有一个后者的例子。