在PyQt中刷新QTextEdit

时间:2009-08-21 04:55:25

标签: python pyqt

我正在编写一个PyQt应用程序,它在一个小部件中获取一些输入,然后处理一些文本文件。

目前我得到的是当用户点击“进程”按钮时,弹出一个带有QTextEdit的单独窗口,并输出一些记录消息。

在Mac OS X上,此窗口会自动刷新,您可以看到该过程。

在Windows上,窗口报告(Not Responding),然后一旦完成所有处理,就会显示日志输出。我假设我需要在每次写入日志后刷新窗口,并且我已经看了一下使用计时器。等等,但havnt运气很好。

以下是源代码。它有两个文件,GUI.py执行所有GUI操作,MOVtoMXF执行所有处理。

GUI.py

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 < 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"

AND MOVtoMXF.py

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) -> 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()

如果需要任何其他代码(我认为这就是所需要的),请告诉我。

任何帮助都会很棒。

标记

1 个答案:

答案 0 :(得分:1)

看起来您正在运行外部程序,将其输出捕获到QTextEdit中。我没有看到Form.process的代码,但我在Windows上猜测你的函数等待外部程序完成,然后快速将所有内容转储到QTextEdit

如果您的界面确实在等待其他进程完成,那么它将以您描述的方式挂起。你需要查看subprocess或者甚至是popen来以“非阻塞”的方式获得程序的输出。

避免“(无响应)”的关键是每隔几秒钟调用QApplication.processEvents几次。 QTimer在这种情况下无济于事,因为如果Qt无法处理其事件,则无法调用任何信号处理程序。