The code sent to output redirection in PyQt does two good things at once: it uses the logging module to conveniently format messages and redirects the standard stdout and stderr to a QT QTextBrowser widget. But I would like QTextBrowser get all print output coming out of the current code. In particular, I want to forward well-formatted messages that come from the registrar. An ideal solution would be to redirect every registrar. QTextBrowser to QTextBrowser (and not just stdout and stderr ). Actually, I would prefer to forward the logger messages instead of stdout and stderr if I need to choose between two ... So, here are the commands used to print formatted messages:
logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message')
And here is the code: 
========
import sys from PyQt4 import QtCore, QtGui import logging logger = logging.getLogger(__name__) class XStream(QtCore.QObject): _stdout = None _stderr = None messageWritten = QtCore.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(QtGui.QDialog): def __init__( self, parent = None ): super(MyDialog, self).__init__(parent) self._console = QtGui.QTextBrowser(self) self._button = QtGui.QPushButton(self) self._button.setText('Test Me') layout = QtGui.QVBoxLayout() layout.addWidget(self._console) layout.addWidget(self._button) self.setLayout(layout) XStream.stdout().messageWritten.connect( self._console.insertPlainText ) XStream.stderr().messageWritten.connect( self._console.insertPlainText ) self._button.clicked.connect(self.test) def test( self ): print 'printing LINE 1' print 'printing LINE 2' logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message')
LAST AFTER: A FULLY WORKING EXAMPLE :: SOLVES Mr.Dano
import sys from PyQt4 import QtCore, QtGui import logging class QtHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self) def emit(self, record): record = self.format(record) if record: XStream.stdout().write('%s\n'%record)
alphanumeric
source share