wxPython使用Publisher实现进度条

时间:2022-01-21 07:11:28
  1 import time
  2 import wx
  3 from threading import Thread
  4 from wx.lib.pubsub import Publisher
  5 
  6 class ParseMML():
  7     souceFile=''
  8     targetFile=''
  9     progressNum=0
 10 
 11     def __init__(self):
 12         pass
 13 
 14     def run(self):
 15         for i in range(0,101,10):
 16             time.sleep(1)
 17             ParseMML.progressNum=i
 18             print(i)
 19 
 20 ########################################################################
 21 class TestThread(Thread):
 22     """Test Worker Thread Class."""
 23     #----------------------------------------------------------------------
 24     def __init__(self):
 25         """Init Worker Thread Class."""
 26         Thread.__init__(self)
 27         self.start()    # start the thread
 28     #----------------------------------------------------------------------
 29     def run(self):
 30         """Run Worker Thread."""
 31         # This is the code executing in the new thread.
 32         Thread(target=ParseMML().run).start()
 33         currentPro=0
 34         while True:
 35             pro = ParseMML.progressNum
 36             time.sleep(1)
 37             if pro==100:
 38                 break
 39             if pro>currentPro and pro <100:
 40                 wx.CallAfter(Publisher().sendMessage, "update", pro)
 41                 currentPro=pro
 42         wx.CallAfter(Publisher().sendMessage, "update", 100)
 43         wx.MessageBox("Done...", "message", wx.OK)
 44 
 45 ########################################################################
 46 class MyProgressDialog(wx.Dialog):
 47     """"""
 48     #----------------------------------------------------------------------
 49     def __init__(self):
 50         """Constructor"""
 51         wx.Dialog.__init__(self, None, title="Progress",size=(250,50))
 52         self.count = 0
 53         self.progress = wx.Gauge(self, range=100,size=(250,50))
 54         sizer = wx.BoxSizer(wx.VERTICAL)
 55 
 56         sizer.Add(self.progress, 0,wx.BOTTOM|wx.ALIGN_CENTER_VERTICAL,0)
 57         self.SetSizer(sizer)
 58         # create a pubsub listener
 59         Publisher().subscribe(self.updateProgress, "update")
 60     #----------------------------------------------------------------------
 61     def updateProgress(self, msg):
 62         """
 63         Update the progress bar
 64         """
 65         self.count = msg.data
 66         if self.count >= 100:
 67             self.Destroy()
 68 
 69         self.progress.SetValue(self.count)
 70 
 71 ########################################################################
 72 class MyFrame(wx.Frame):
 73     #----------------------------------------------------------------------
 74     def __init__(self):
 75         wx.Frame.__init__(self, None, title="Progress Bar ...")
 76         # Add a panel so it looks the correct on all platforms
 77         panel = wx.Panel(self, wx.ID_ANY)
 78         self.btn = btn = wx.Button(panel, label="Start Thread")
 79         btn.Bind(wx.EVT_BUTTON, self.onButton)
 80         sizer = wx.BoxSizer(wx.VERTICAL)
 81         sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
 82         panel.SetSizer(sizer)
 83     #----------------------------------------------------------------------
 84     def onButton(self, event):
 85         """
 86         Runs the thread
 87         """
 88         btn = event.GetEventObject()
 89         btn.Disable()
 90         TestThread()
 91         dlg = MyProgressDialog()
 92         dlg.ShowModal()
 93         btn.Enable()
 94 #----------------------------------------------------------------------
 95 # Run the program
 96 if __name__ == "__main__":
 97     app = wx.App(False)
 98     frame = MyFrame()
 99     frame.Show()
100     app.MainLoop()