title: Refresh QTextEdit in PyQt
body: <p>Im writing a PyQt app that takes some input in one widget, and then processes some text files.</p>
  
  <p>What ive got at the moment is when the user clicks the "process" button a seperate window with a QTextEdit in it pops up, and ouputs some logging messages.</p>
  
  <p>On Mac OS X this window is refreshed automatically and you cna see the process.</p>
  
  <p>On Windows, the window reports (Not Responding) and then once all the proccessing is done, the log output is shown. Im assuming I need to refresh the window after each write into the log, and ive had a look around at using a timer. etc, but havnt had much luck in getting it working.</p>
  
  <p>Below is the source code. It has two files, GUI.py which does all the GUI stuff and MOVtoMXF that does all the processing.</p>
  
  <p>GUI.py</p>
  
  <pre><code>import os
  import sys
  import MOVtoMXF
  from PyQt4.QtCore import *
  from PyQt4.QtGui import *
  
  
   class Form(QDialog):
  
       def process(self):
             path = str(self.pathBox.displayText())
             if(path == ''):
                  QMessageBox.warning(self, "Empty Path", "You didnt fill something out.")
                  return
             xmlFile = str(self.xmlFileBox.displayText())
             if(xmlFile == ''):
                  QMessageBox.warning(self, "No XML file", "You didnt fill something.")
                  return
             outFileName = str(self.outfileNameBox.displayText())
             if(outFileName == ''):
                  QMessageBox.warning(self, "No Output File", "You didnt do something")
                  return
             print path + "  " + xmlFile + " " + outFileName
             mov1 = MOVtoMXF.MOVtoMXF(path, xmlFile, outFileName, self.log)
             self.log.show()
             rc = mov1.ScanFile()
             if( rc &lt; 0):
                 print "something happened"
             #self.done(0)
  
  
        def __init__(self, parent=None):
              super(Form, self).__init__(parent)
              self.log = Log()
              self.pathLabel = QLabel("P2 Path:")
              self.pathBox = QLineEdit("")
              self.pathBrowseB = QPushButton("Browse")
              self.pathLayout = QHBoxLayout()
              self.pathLayout.addStretch()
              self.pathLayout.addWidget(self.pathLabel)
              self.pathLayout.addWidget(self.pathBox)
              self.pathLayout.addWidget(self.pathBrowseB)
  
              self.xmlLabel = QLabel("FCP XML File:")
              self.xmlFileBox = QLineEdit("")
              self.xmlFileBrowseB = QPushButton("Browse")
              self.xmlLayout = QHBoxLayout()
              self.xmlLayout.addStretch()
              self.xmlLayout.addWidget(self.xmlLabel)
              self.xmlLayout.addWidget(self.xmlFileBox)
              self.xmlLayout.addWidget(self.xmlFileBrowseB)
  
  
              self.outFileLabel = QLabel("Save to:")
              self.outfileNameBox = QLineEdit("")
              self.outputFileBrowseB = QPushButton("Browse")
              self.outputLayout = QHBoxLayout()
              self.outputLayout.addStretch()
              self.outputLayout.addWidget(self.outFileLabel)
              self.outputLayout.addWidget(self.outfileNameBox)
              self.outputLayout.addWidget(self.outputFileBrowseB)
  
              self.exitButton = QPushButton("Exit")
              self.processButton = QPushButton("Process")
              self.buttonLayout = QHBoxLayout()
              #self.buttonLayout.addStretch()
              self.buttonLayout.addWidget(self.exitButton)
              self.buttonLayout.addWidget(self.processButton) 
              self.layout = QVBoxLayout()
              self.layout.addLayout(self.pathLayout)
              self.layout.addLayout(self.xmlLayout)
              self.layout.addLayout(self.outputLayout)
              self.layout.addLayout(self.buttonLayout)
              self.setLayout(self.layout)
              self.pathBox.setFocus()
              self.setWindowTitle("MOVtoMXF")
  
              self.connect(self.processButton, SIGNAL("clicked()"), self.process)
              self.connect(self.exitButton, SIGNAL("clicked()"), self, SLOT("reject()"))
              self.ConnectButtons()
  
  
  class Log(QTextEdit):
  
      def __init__(self, parent=None):
          super(Log, self).__init__(parent)
          self.timer = QTimer()
          self.connect(self.timer, SIGNAL("timeout()"), self.updateText())
          self.timer.start(2000) 
  
      def updateText(self):
          print "update Called"
  </code></pre>
  
  <p>AND MOVtoMXF.py</p>
  
  <pre><code>import os
  import sys
  import time
  import string
  import FileUtils
  import shutil
  import re
  
      class MOVtoMXF:
      #Class to do the MOVtoMXF stuff.
  
      def __init__(self, path, xmlFile, outputFile, edit):
          self.MXFdict = {}
          self.MOVDict = {}
          self.path = path
          self.xmlFile = xmlFile
          self.outputFile = outputFile
          self.outputDirectory = outputFile.rsplit('/',1)
          self.outputDirectory = self.outputDirectory[0]
          sys.stdout = OutLog( edit, sys.stdout)
  
  
  
  class OutLog():
  
      def __init__(self, edit, out=None, color=None):
          """(edit, out=None, color=None) -&gt; can write stdout, stderr to a
          QTextEdit.
          edit = QTextEdit
          out = alternate stream ( can be the original sys.stdout )
          color = alternate color (i.e. color stderr a different color)
          """
          self.edit = edit
          self.out = None
          self.color = color
  
  
  
      def write(self, m):
          if self.color:
              tc = self.edit.textColor()
              self.edit.setTextColor(self.color)
  
          #self.edit.moveCursor(QtGui.QTextCursor.End)
          self.edit.insertPlainText( m )
  
          if self.color:
              self.edit.setTextColor(tc)
  
          if self.out:
              self.out.write(m)
          self.edit.show()
  </code></pre>
  
  <p>If any other code is needed (i think this is all that is needed) then just let me know.</p>
  
  <p>Any Help would be great.</p>
  
  <p>Mark</p>