1

多くのクラスと関数を備えた QApplication があり、コンソールに多くの stdout が表示されます。この stdout と stderr を QTextBrowser にリダイレクトしたい (これも QApplication の一部です)。これを行うための微調整はありますか。

4

1 に答える 1

3

オープンソースのPyQtカスタムウィジェットのライブラリを作成しました。1つはロガークラス(XLoggerWidget)で、もう1つは完全な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にあります

少し長くて複雑なので、ここにロードするつもりはありません...しかし、それについて質問があれば、私に知らせてください。

于 2012-08-01T17:22:48.637 に答える