在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,这导致在事件结束时删除了所有组件,甚至是新构建的组件。
答案 0 :(得分:1)
您实际使用的是线程模块还是与线程相关的任何内容?你真的不需要那些删除wxPython中的小部件。我不确定你为什么要首先摧毁你所有的小部件。为什么不隐藏主框架并显示包含所有新窗口小部件的子框架?或者使用两个面板。一个面板被销毁,另一个面板与其他小部件放在一起?我在blog上有一个后者的例子。