• Python中将系统输出显示在PyQt中


    开发一个系统,需要将系统的输出显示在PyQt中,可以直接截获sys.stdout,也可以使用信号和槽来实现。

    直接显示:

    """
    Example usage:
    import sys
    sys.stdout = OutLog( edit, sys.stdout)
    sys.stderr = OutLog( edit, sys.stderr, QtGui.QColor(255,0,0) )
    """
    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):
            
    global aSigalOutLog

            
    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)

    这种方法在多线程处理时可能有点问题,下面可以使用信号和槽来实现:

    #encoding=gb2312

    import sys
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtCore import *
    from PyMailServerMain import Ui_MainWindow


    #信用信号和槽来处理日志
    class SigalOutLogSender(QObject):
        
    def SendMsg(self, m):
            self.emit(SIGNAL(
    'DisplayLog(QString)'),m)

    aSigalOutLog
    =SigalOutLogSender()

    class OutLog:
        
    def __init__(self):
            
    pass

        
    def write(self, m):
            
    global aSigalOutLog
            aSigalOutLog.SendMsg(u
    '%s' % m)


    class StartQt4(QtGui.QMainWindow):
        
    def __init__(self, parent=None):
            QtGui.QWidget.
    __init__(self, parent)
            self.ui 
    = Ui_MainWindow()
            self.ui.setupUi(self)

            QtCore.QObject.connect(self.ui.btnSendMail,QtCore.SIGNAL(
    "clicked()"), self.ProcessSend, 1)

            
    #捕捉系统输出
            sys.stdout = OutLog()
            sys.stderr 
    = OutLog()

            
    #使用信号和槽来处理日志
            global aSigalOutLog
            QtCore.QObject.connect(aSigalOutLog,QtCore.SIGNAL(
    "DisplayLog(QString)"), self.DisplayLog, 1)
        
    def ProcessSend(self):
            
    #使用信号和槽来处理日志
            global aSigalOutLog
            
    print u'测试标准输出'

        
    def DisplayLog(self,log):
            self.ui.memLog.moveCursor(QtGui.QTextCursor.End)
            self.ui.memLog.insertPlainText(log)


    if __name__ == "__main__":
        app 
    = QtGui.QApplication(sys.argv)
        myapp 
    = StartQt4()
        myapp.show()
        sys.exit(app.exec_())
  • 相关阅读:
    【Linux】Mac PD set centos static ip
    【Linux】Set CentOS no GUI default
    【QT】qt python install pip
    【QT】Installer requires Xcode Version 5.0.0 for Qt download if toolchain not found
    【Solution】idea中dtd没有找到
    【Mac】-NO.161.Mac.1 -【MacOS Error running 'Tomcat 8.5.371': Cannot run program Permission denied】
    【Eclipse】-NO.163.Eclipse.1 -【Eclipse springboot 1.x 创建maven工程初始化报错】
    C----循环
    scrapy库安装
    C----框架、变量、常量、赋值、复合赋值、初始化、表达式、运算符
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1981360.html
Copyright © 2020-2023  润新知