Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading wxPython螺纹wxGauge_Multithreading_Wxpython - Fatal编程技术网

Multithreading wxPython螺纹wxGauge

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,

我试图学习使用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, 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一起工作,但我认为最好将计时器从事件处理程序中取出。附上新的解决方案。