2012-07-13 4 views
1

J'ai un QApplication, avec beaucoup de classes et de fonctions, qui affiche beaucoup de stdout sur la console. Je veux rediriger ce stdout et stderr à un QTextBrowser (cela fait également partie de la QApplication). Y at-il un tweak pour le faire.Rediriger la sortie dans PyQt

+0

Pour plus d'informations sur la redirection de la sortie vers python, consultez ce lien: [Comment capturer la sortie de l'interpréteur Python et l'afficher dans un widget Texte?] (Http://stackoverflow.com/questions/8356336/how-to-capture -output-of-pythons-interpreter-and-show-in-a-text-widget) – kasa

Répondre

3

J'ai créé une bibliothèque de widgets personnalisés PyQt open-source, dont l'un est un classeur (XLoggerWidget) et un autre est un interpréteur Python complet (XConsoleEdit). Il fait ce que vous cherchez.

Vous pouvez l'obtenir ici si vous voulez: http://dev.projexsoftware.com/projects/projexui

La partie que vous cherchez est dans le XConsoleEdit (projexui.widgets.xconsoleedit), mais le sens général de c'est:

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_() 

Ceci est une version simplifiée de quoi dans le XConsoleEdit, mais c'est l'idée générale et devrait toujours fonctionner pour ce que vous allez si vous ne voulez pas télécharger le code.

Dans cet exemple, vous remarquerez que seuls les journaux d'impression et d'erreur sont acheminés vers l'édition. Si vous souhaitez connecter le système de journalisation Python à l'édition, vous aurez besoin de quelque chose d'un peu plus complexe où vous définissez un journal de logs.Handler et le lier à votre widget.

Ce code serait trouvé dans projexui.widgets.xloggerwidget

Il est un peu plus long et plus complexe, donc je ne vais pas le charger ici ... mais si vous avez des questions à ce sujet, faites le moi savoir.

+1

# SEULEMENT VÉRIFIEZ CE LIEN POUR OBTENIR DES INFO SUR LA REDIRECTION DE LA SORTIE EN PYTHON http://stackoverflow.com/questions/8356336/how-to- capture-sortie-de-pythons-interprète-et-show-dans-un-widget-texte – kasa