簡體   English   中英

在PyQt中刷新QTextEdit

[英]Refresh QTextEdit in PyQt

我正在編寫一個PyQt應用程序,該應用程序在一個小部件中接受一些輸入,然后處理一些文本文件。

我現在得到的是,當用戶單擊“處理”按鈕時,將彈出一個單獨的窗口,其中帶有QTextEdit,並輸出一些日志消息。

在Mac OS X上,此窗口會自動刷新,您可以看到該過程。

在Windows上,該窗口將報告(無響應),然后在完成所有處理后,將顯示日志輸出。 我假設每次寫入日志后都需要刷新窗口,而我已經使用計時器進行了四處瀏覽。 等等,但是havnt使它運轉起來很幸運。

下面是源代碼。 它有兩個文件,GUI.py和MOVtoMXF完成所有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"

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

如果需要任何其他代碼(我想這就是所需要的全部),那就告訴我。

任何幫助都會很棒。

標記

看來您正在運行一個外部程序,將其輸出捕獲到QTextEdit中。 我沒有看到Form.process的代碼,但是我猜測在Windows上,您的函數等待外部程序完成,然后將所有內容快速轉儲到QTextEdit

如果您的界面確實在等待其他過程完成,那么它將以您描述的方式掛起。 您將需要查看子進程,甚至可能需要popen才能以“非阻塞”方式獲取程序的輸出。

避免“(無響應)”的關鍵是每幾秒鍾幾次調用QApplication.processEvents 在這種情況下, QTimer將無濟於事,因為如果Qt無法處理其事件,它將無法調用任何信號處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM