zoukankan      html  css  js  c++  java
  • 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_())
  • 相关阅读:
    storm学习之七-storm UI页面参数详解
    kafka学习之-KafkaOffsetMonitor后台监控
    hbase深入了解
    storm学习之六-使用Maven 生成jar包多种方式
    kafka学习之-集群配置及安装
    Python的Web应用框架--Django
    plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
    key-value数据库-Redis
    SUSE 12安装详解
    分布式网络文件系统--MooseFS
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1981360.html
Copyright © 2011-2022 走看看