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_())
  • 相关阅读:
    Mvc form提交
    FlexiGrid 使用 全选、自动绑定
    Mysql Insert Or Update语法例子
    orderby与groupby同时使用
    SQLSTATE[HY000] [2002] No such file or directory in
    swoole安装
    关于商城分类查询表结构与数据查询
    查询数据库每张表的信息
    php 正则验证
    PHP代码优化
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1981360.html
Copyright © 2011-2022 走看看