Multithreading wxPython螺纹wxGauge
我试图学习使用wxPython进行线程处理,所以我尝试让这个简单的示例工作,但进度条更新似乎发生在“长过程”完成之后。有人能告诉我为什么这不起作用吗Multithreading wxPython螺纹wxGauge,multithreading,wxpython,Multithreading,Wxpython,我试图学习使用wxPython进行线程处理,所以我尝试让这个简单的示例工作,但进度条更新似乎发生在“长过程”完成之后。有人能告诉我为什么这不起作用吗 #!/usr/bin/env python import time import wx from wx.lib.pubsub import Publisher as pub class Window(wx.Frame): def __init__(self): wx.Frame.__init__(self, None,
#!/usr/bin/env python
import time
import wx
from wx.lib.pubsub import Publisher as pub
class Window(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="wxGauge")
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.gauge = wx.Gauge(self, range=10)
self.btn = wx.Button(self, label="Start process")
self.sizer.Add(self.gauge)
self.sizer.Add(self.btn)
self.SetSizerAndFit(self.sizer)
pub.subscribe(self.update, "update")
self.btn.Bind(wx.EVT_BUTTON, self.OnClick)
self.Show()
def update(self, msg):
self.gauge.SetValue(msg.data)
def OnClick(self, evt):
for i in range(10):
wx.CallAfter(pub.sendMessage, "update", i + 1)
time.sleep(1)
if __name__ == '__main__':
app = wx.App()
Window()
app.MainLoop()
这是因为“CallAfter”的用法。如果以这种方式调用“sendMessage”,它实际上是在事件处理程序完成后调用的 您可以通过以下方式进行尝试:
for i in range(10):
pub.sendMessage("update", i+1)
time.sleep(1)
编辑:
将此“sendMessage”从事件处理程序中删除
import time
import wx
from wx.lib.pubsub import Publisher as pub
class Window(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="wxGauge")
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.gauge = wx.Gauge(self, range=10)
self.btn = wx.Button(self, label="Start process")
self.sizer.Add(self.gauge)
self.sizer.Add(self.btn)
self.SetSizerAndFit(self.sizer)
pub.subscribe(self.update, "update")
self.btn.Bind(wx.EVT_BUTTON, self.OnClick)
self.Bind(wx.EVT_TIMER, self.TimerHandler)
self.timer = wx.Timer(self)
self.gaugeIndex = 0
self.Show()
def TimerHandler(self, event):
self.gaugeIndex += 1
pub.sendMessage("update", self.gaugeIndex)
if self.gaugeIndex == 10:
self.timer.Stop()
def update(self, msg):
self.gauge.SetValue(msg.data)
def OnClick(self, evt):
self.timer.Start(1000)
if __name__ == '__main__':
app = wx.App(redirect=False)
Window()
app.MainLoop()
这也不起作用,GUI冻结10秒,然后仪表被填满。也许睡眠冻结事件处理程序,然后冻结GUI,虽然它与我的wxpython 2.8一起工作,但我认为最好将计时器从事件处理程序中取出。附上新的解决方案。