wxPython: Threading GUI --> Using Custom Event Handler

后端 未结 3 1161
孤街浪徒
孤街浪徒 2021-02-06 18:41

I am trying to learn how to run a thread off the main GUI app to do my serial port sending/receiving while keeping my GUI alive. My best Googling attempts have landed me at the

3条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-06 19:42

    You may want to use Python threads and queues and not custom events. I have a wxPython program (OpenSTV) that loads large files that caused the gui to freeze during the loading. To prevent the freezing, I dispatch a thread to load the file and use a queue to communicate between the gui and the thread (e.g., to communicate an exception to the GUI).

      def loadBallots(self):
        self.dirtyBallots = Ballots()
        self.dirtyBallots.exceptionQueue = Queue(1)
        loadThread = Thread(target=self.dirtyBallots.loadUnknown, args=(self.filename,))
        loadThread.start()
    
        # Display a progress dialog
        dlg = wx.ProgressDialog(\
          "Loading ballots",
          "Loading ballots from %s\nNumber of ballots: %d" % 
          (os.path.basename(self.filename), self.dirtyBallots.numBallots),
          parent=self.frame, style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME
        )
        while loadThread.isAlive():
          sleep(0.1)
          dlg.Pulse("Loading ballots from %s\nNumber of ballots: %d" %
                    (os.path.basename(self.filename), self.dirtyBallots.numBallots))
        dlg.Destroy()
    
    if not self.dirtyBallots.exceptionQueue.empty():
      raise RuntimeError(self.dirtyBallots.exceptionQueue.get())
    

提交回复
热议问题