title: Python PyQT: How to call a GUI function from a worker thread?
body: <p>I have a pyqt gui and calling a long process (ffmpeg) which I put on a separate thread to not block the gui. I then want to update a progress bar when one command of a longer list of commands finishes. The problem is, that I can't call a function in the gui thread out of the worker thread. So I let run a ticker in the worker thread, but when I update the progress bar with a while loop and reading the ticker value, the gui gets blocked again. How can I solve this. I used currently python threading and not Qthread.
  Thx for any help!</p>
  
  <pre><code>import threading, pexpect
  
  self.cmd_list = ['ffmpeg -i file outfile','and so on']
  
  self.stop_proc = False
  self.executeCMD()
  
  def spawn_ffmpeg_cmd(self):
      for cmd in self.cmd_list:
          if self.stop_proc == False:
              thread = pexpect.spawn(cmd)
              print "\nstarted: %s" % cmd
              cpl = thread.compile_pattern_list([pexpect.EOF,"frame= *\d+ fps=*\d+",'(.+)'])
  
              while True:
                  i = thread.expect_list(cpl, timeout=None)
                  if i == 0: # EOF
                      print "the sub process exited"
                      self.pgticker += 1
                      break
                  elif i == 1:
                      frame_number_fps = thread.match.group(0)
                      print frame_number_fps
                      thread.close
                  elif i == 2:
                      pass
      self.startButton.setEnabled(True)
  
  
  def executeCMD(self):
      self.startButton.setEnabled(False)
      self.pgticker = 0
      threading.Thread(target=self.spawn_ffmpeg_cmd, name="_proc").start()
  
  
  def stopprocess(self):
      self.stop_proc = True
      self.cmd_list = []
      os.system('pkill ffmpeg') 
      self.pgticker = len(self.cmd_list)
      self.startButton.setEnabled(True)
  
  
  def updateProgress(self):  
      pgfactor = 100 / len(self.cmd_list)
      progress = 0.0
      progress = pgfactor*int(self.pgticker)
      self.progressBar.setProperty("value", progress)
  </code></pre>