我有一个QApplication,有很多类和函数,在控制台上显示了很多stdout。我想将此stdout和stderr重定向到QTextBrowser(这也是QApplication的一部分)。有什么调整可以做到这一点。
答案 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
中找到它有点长,更复杂,所以我不打算在这里加载它...但是如果你对它有任何疑问,请告诉我。