0

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

4

1 回答 1

1

您实际上是在使用线程模块还是与线程相关的任何东西?你真的不应该需要那些来删除 wxPython 中的小部件。我不确定您为什么首先要销毁所有小部件。为什么不直接隐藏主框架并显示带有所有新小部件的子框架?或者使用两个面板。一个面板被破坏,另一个面板与其他小部件被放置在它的位置?我的博客上有后者的例子。

于 2012-08-07T15:59:29.907 回答