多くのクラスと関数を備えた QApplication があり、コンソールに多くの stdout が表示されます。この stdout と stderr を QTextBrowser にリダイレクトしたい (これも QApplication の一部です)。これを行うための微調整はありますか。
1 に答える
オープンソースの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にあります
少し長くて複雑なので、ここにロードするつもりはありません...しかし、それについて質問があれば、私に知らせてください。