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