2011-12-02 50 views
16

我有一個PyQt程序,用於在Windows上運行。 該程序進行大量操作並打印大量信息。 但是,因爲我想凍結它,並且不希望提示屏幕出現,我希望所有這些信息出現在主應用程序中,在QTextEdit左右。 我怎樣才能使程序工作,以便它從解釋器獲得輸出並同時在textEdit上顯示它,就像它在真正的解釋器上一樣?如何捕獲Python解釋器的輸出並顯示在Text小部件中?

回答

29

我假設「從解釋器輸出」是指輸出寫入控制檯或終端窗口,例如使用print()生成的輸出。

Python生成的所有控制檯輸出都被寫入程序的輸出流sys.stdout(正常輸出)和sys.stderr(錯誤輸出,例如異常回溯)。這些文件類對象。

您可以用您自己的文件類對象替換這些流。您所有的自定義實現必須提供的是一個write(text)函數。通過提供自己的實現,可以將所有輸出轉發給您的小工具:

class MyStream(object): 
    def write(self, text): 
     # Add text to a QTextEdit... 

sys.stdout = MyStream() 
sys.stderr = MyStream() 

如果你需要重置這些流,他們仍然可以作爲sys.__stdout__sys.__stderr__

sys.stdout = sys.__stdout__ 
sys.stderr = sys.__stderr__ 

更新

這是PyQt4的一些工作代碼。首先定義寫入其報告中的數據與Qt的信號流:現在

from PyQt4 import QtCore 

class EmittingStream(QtCore.QObject): 

    textWritten = QtCore.pyqtSignal(str) 

    def write(self, text): 
     self.textWritten.emit(str(text)) 

,在你的GUI,安裝此流的實例sys.stdouttextWritten信號連接到文本寫入到一個時隙QTextEdit

# Within your main window class... 

def __init__(self, parent=None, **kwargs): 
    # ... 

    # Install the custom output stream 
    sys.stdout = EmittingStream(textWritten=self.normalOutputWritten) 

def __del__(self): 
    # Restore sys.stdout 
    sys.stdout = sys.__stdout__ 

def normalOutputWritten(self, text): 
    """Append text to the QTextEdit.""" 
    # Maybe QTextEdit.append() works as well, but this is how I do it: 
    cursor = self.textEdit.textCursor() 
    cursor.movePosition(QtGui.QTextCursor.End) 
    cursor.insertText(text) 
    self.textEdit.setTextCursor(cursor) 
    self.textEdit.ensureCursorVisible() 
+1

我喜歡你的建議。看起來很容易實現。但是,我需要爲它創建一個新的課程嗎?我的意思是,我可以在我的主窗口的同一個類中創建寫入功能嗎? –

+0

@ dex19dt:你當然可以,但我會反對它,因爲它違反了單一責任原則。在我的代碼中,我創建了一個流類,該類的子類爲'QObject',並且具有'write()'發出的'textWritten'信號。然後,我只需將該信號連接到我的窗口中的一個插槽,該插槽將文本附加到「QTextEdit」中。優點:我可以格式化正常輸出和錯誤輸出。後者使用紅色文字顏色。 –

+0

好的。所以我創建了另一個名爲stream.py的文件並粘貼你寫的代碼。我將它導入到主程序中,它不會引發任何錯誤,但它不會將文本插入到textEdit小部件中。我寫的函數很簡單'self.textEdit.append(str(text))'它錯了嗎? –

3

可惜的是該示例不PySide工作。它提供了以下錯誤:

sys.stdout = EmittingStream(textWritten=self.write2Console) 
AttributeError: 'textWritten()' is not a Qt property or a signal 

我們需要進行以下更改爲它與PySide工作:

sys.stdout = EmittingStream() 
self.connect(sys.stdout,QtCore.SIGNAL('textWritten(QString)'),self.write2Console) 
+0

根據[新sintax](http://qt-project.org/wiki/Signals_and_Slots_in_PySide),這將是'sys.stdout.textWritten.connect(self .write2Console)' – iled

0

我貼一些東西的終端應用PySide這個前陣子Terminal like app in PySide 。如果您正在查看PyQt,請檢查PySide。除了授權和語法上的一些差異之外,它們基本上是相同的。

相關問題