wxpython中使用thread的问题?

wxpython中使用thread的问题?

为了自动更新wxpython程序中的文本数据(wx.StaticText).  而又不影响交互操作。。
程序利用 wx.Notebook 来分页

我使用
import thread
thread.start_new(func,())
来新开线程生成新数据, 其中 func  除了生成数据外还 通过访问 frame中的 wx.StaticText.SetLabel()
来使得新的数据能够在界面中显示。
这部分功能运行良好。

但问题随之而来。   只要新线程通过 wx.StaticText.SetLabel() 来更新了数据。

同一窗口中不同页中的 wx.Choice 就不能正常显示弹出菜单。  而这个wx.Choice所用到的数据和 func 更新的数据是毫无关联的。。

线程结束后,问题仍然存在。 能刷新的都刷新了(frame,panel,page,choice)。问题也仍然存在。

被这个问题困扰了好久。 就算放弃wx.Notebook, 使用MDIFrame 分页,也不行。


请问大家有解决思路吗?   谢谢。

"不要在子线程中进行GUI的更新处理,所有的GUI的更新全部由GUI线程(主线程)来完成"     

limodou  blog上的这句话 点中我问题的要害了。
可以尝试通过事件来更新label,而不是直接去调用SetLabel, 参考一下wxpython中demo里有一个多线程的例子。
哈   终于搞定这困扰我3天的问题。。   
心得: 我利用thread是想在不中断界面交互性的情况下。在新线程中启动一个time.sleep()  计时器。 间隔一定的时间更新 界面信息。 当时不知道 wxpython 早已准备好了 wx.Timer 来替代在新线程中的time.sleep。  也不知道 wxpython不能在新线程中进行GUI更新处理。 wxpython in Action 中这么重要的章节都看漏。。。 自我批评10次。

thread.start_new(self.RefreshThread,( ))
def RefreshThread(self):
      while 1:
            time.sleep(5)
            self.refreshFan()
            self.refreshStats()
这是我之前引起问题解决方法

现在的处理方法:
self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER,self.OnTimer,self.timer)
        self.timer.Start(5000)
def OnTimer(self,evt):
        self.refreshFan()
        self.refreshStats()
在线程中更新GUI的一个简单的方法就是调用wx.CallAfter,现在我的 UliPad 中大量使用它。它的作用就是注册新的事件,然后将wx.CallAfter()所指定的函数注册到新事件处理句柄中,然后通过向系统事件队列发送新的消息。这样当新清息被处理时,指定的函数将在主线程中执行。因此你仍然可以使用线程来处理,只是在需要更新GUI时使用wx.CallAfter即可。
恩。。   我也想到,幸好我需要定时执行的代码只消耗很少的运行时间。 不然利用wx.Timer在主进程中运行肯定会造成GUI交互延时。
恩,刚看到wx.CallAfter,感觉不错