【问题标题】:Redirecting Output in PyQt在 PyQt 中重定向输出
【发布时间】:2012-07-13 07:27:10
【问题描述】:

我有一个 QApplication,有很多类和函数,它在控制台上显示很多标准输出。我想将此标准输出和标准错误重定向到 QTextBrowser(这也是 QApplication 的一部分)。是否有任何调整可以做到这一点。

【问题讨论】:

标签: console pyqt redirect


【解决方案1】:

我制作了一个开源 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 中找到

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2014-11-17
  • 2016-04-10
相关资源
最近更新 更多