在PyQt中重定向输出

时间:2012-07-13 07:27:10

标签: console pyqt redirect

我有一个QApplication,有很多类和函数,在控制台上显示了很多stdout。我想将此stdout和stderr重定向到QTextBrowser(这也是QApplication的一部分)。有什么调整可以做到这一点。

1 个答案:

答案 0 :(得分:3)

我创建了一个开源PyQt自定义小部件库 - 其中一个是记录器类(XLoggerWidget),另一个是完整的Python解释器(XConsoleEdit)。它可以满足您的需求。

如果您愿意,可以在此处获取:http://dev.projexsoftware.com/projects/projexui

您正在寻找的部分位于XConsoleEdit(projexui.widgets.xconsoleedit)中,但它的一般要点是:

import logging
import sys

from PyQt4.QtCore import QObject,\
                         pyqtSignal

from PyQt4.QtGui import QDialog, \
                        QVBoxLayout, \
                        QPushButton, \
                        QTextBrowser,\
                        QApplication

logger = logging.getLogger(__name__)

class XStream(QObject):
    _stdout = None
    _stderr = None

    messageWritten = pyqtSignal(str)

    def flush( self ):
        pass

    def fileno( self ):
        return -1

    def write( self, msg ):
        if ( not self.signalsBlocked() ):
            self.messageWritten.emit(unicode(msg))

    @staticmethod
    def stdout():
        if ( not XStream._stdout ):
            XStream._stdout = XStream()
            sys.stdout = XStream._stdout
        return XStream._stdout

    @staticmethod
    def stderr():
        if ( not XStream._stderr ):
            XStream._stderr = XStream()
            sys.stderr = XStream._stderr
        return XStream._stderr

class MyDialog(QDialog):
    def __init__( self, parent = None ):
        super(MyDialog, self).__init__(parent)

        # setup the ui
        self._console = QTextBrowser(self)
        self._button  = QPushButton(self)
        self._button.setText('Test Me')

        # create the layout
        layout = QVBoxLayout()
        layout.addWidget(self._console)
        layout.addWidget(self._button)
        self.setLayout(layout)

        # create connections
        XStream.stdout().messageWritten.connect( self._console.insertPlainText )
        XStream.stderr().messageWritten.connect( self._console.insertPlainText )

        self._button.clicked.connect(self.test)

    def test( self ):
        # print some stuff
        print 'testing'
        print 'testing2'

        # log some stuff
        logger.debug('Testing debug')
        logger.info('Testing info')
        logger.warning('Testing warning')
        logger.error('Testing error')

        # error out something
        print blah

if ( __name__ == '__main__' ):
    logging.basicConfig()

    app = None
    if ( not QApplication.instance() ):
        app = QApplication([])

    dlg = MyDialog()
    dlg.show()

    if ( app ):
        app.exec_()

这是XConsoleEdit中的简化版本,但它是一般的想法,如果您不想下载代码,它仍然可以用于您的目的。

在这个示例中,您会注意到只有打印和错误日志被路由到编辑。如果要将Python日志记录系统连接到编辑,那么在定义logging.Handler并将其链接到窗口小部件时,您需要更复杂的东西。

该代码可以在projexui.widgets.xloggerwidget

中找到

它有点长,更复杂,所以我不打算在这里加载它...但是如果你对它有任何疑问,请告诉我。