在PyQt的

问题描述:

重定向输出I具有的QApplication,有很多的类和函数,它在控制台上显示很多标准输出。我想重定向这个输出和错误的QTextBrowser(这也是的QApplication的一部分)。有没有任何调整来做到这一点。在PyQt的

+0

请检查此链接以获取有关将输出重定向到python的信息: [如何捕获Python解释器的输出并在Text小部件中显示?](http://*.com/questions/8356336/how-to-capture -python -output-of-pythons-interpreter-and-show-in-a-text-widget) – kasa 2012-08-03 07:32:42

我已经制作了一个开源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

发现它有点更长,更复杂,所以我不打算在这里加载它......但如果你对此有任何疑问,让我知道。

+1

#请检查此链接以获取有关重新生成PYTHON中的输出的信息http://*.com/questions/8356336/how-to-捕获输出的 - 蟒蛇口译和秀-IN-A-文本控件 – kasa 2012-08-03 07:31:49