这是一个例子:
class DemoFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = wx.Panel(self, -1)
...
initialize other elements
...
self.DoStuff()
def DoStuff(self):
self.panel.SetBackGroundColour(wx.Colour(240, 240, 240))
...
do something
...
现在,正如您所知,这绝对不是初始化 GUI 的一个好例子,因为做某事
很可能会在 GUI 运行时卡住 GUI,所以我将其调整为:
import threading
class DemoFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.panel = wx.Panel(self, -1)
...
initialize other elements
...
DoStuffThead = threading.Thread(target = self.DoStuff, ())
DoStuffThead.start()
def DoStuff(self):
wx.CallAfter(self.ChangeBG, )
...
do something
...
def ChangeBG(self):
self.panel.SetBackGroundColour(wx.Colour(240, 240, 240))
上面的代码应该与第一个代码在 do Something
为空白时完全相同,但令我惊讶的是,我注意到在运行后面的代码时几乎没有背景绘制故障。
哪部分出了问题?这不是在线程中更新 GUI 的正确方法吗?
最佳答案
从工作线程更新 GUI 是一种糟糕的方法,而不是说它不是线程安全的事件。 您必须与主线程通信才能更新 GUI。
达到预期结果的最佳方法是使用wx.PostEvent
方法。您可以根据需要创建自定义事件,继承自wx.PyEvent
,并且最好继承threading.Thread
以将要在该线程类中通信的窗口保留为实例变量。
有关如何更新具有长时间运行任务的 GUI 的最佳说明可以在 wxPython wiki 中找到。 (第一个例子)。
关于python - wxpython 线程框架初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18271696/