我有一個PyQt程序,用於在Windows上運行。 該程序進行大量操作並打印大量信息。 但是,因爲我想凍結它,並且不希望提示屏幕出現,我希望所有這些信息出現在主應用程序中,在QTextEdit左右。 我怎樣才能使程序工作,以便它從解釋器獲得輸出並同時在textEdit上顯示它,就像它在真正的解釋器上一樣?如何捕獲Python解釋器的輸出並顯示在Text小部件中?
回答
我假設「從解釋器輸出」是指輸出寫入控制檯或終端窗口,例如使用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.stdout
和textWritten
信號連接到文本寫入到一個時隙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()
我建議你使用日誌庫。 http://docs.python.org/library/logging.html 您可以編寫自己的日誌處理程序來與QTextEdit進行通信。這裏有一個很好的教程,可以幫助你開始:http://pantburk.info/?blog=77
可惜的是該示例不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)
根據[新sintax](http://qt-project.org/wiki/Signals_and_Slots_in_PySide),這將是'sys.stdout.textWritten.connect(self .write2Console)' – iled
我貼一些東西的終端應用PySide這個前陣子Terminal like app in PySide 。如果您正在查看PyQt,請檢查PySide。除了授權和語法上的一些差異之外,它們基本上是相同的。
- 1. PYQT:如何捕獲python解釋器的輸出並將其顯示在QEditText中?
- 2. 如何捕獲輸出並使用Python同時顯示它?
- 3. 如何從Python腳本捕獲Python解釋器和/或CMD.EXE的輸出?
- 4. 如何重定向python解釋器的輸出,並在C++程序中的字符串中捕獲它?
- 5. 如何突出顯示Text小部件的當前行?
- 6. 從Julia捕獲並顯示輸出
- 7. 如何在Python中捕獲外部進程的輸出
- 8. 如何在python中退出解釋器?
- 9. 如何在散景python中捕獲下拉小部件的值?
- 10. 在PHP中捕獲Python腳本輸出並避免雙輸出
- 11. Python日誌python解釋器輸出
- 12. Python打印函數在解釋器中獲取意外輸出?
- 13. wxPython - 在textctrl小部件中捕獲shell輸出?
- 14. Raspberry Pi:如何在TFT顯示器上顯示python的輸出
- 15. 從圖像中捕獲部分文本並突出顯示捕獲的文本
- 16. Perl:如何在同一時間捕獲變量中的輸出並將其顯示在標準輸出中?
- 17. 解釋python的輸出memory_profiler
- 18. 在Python中獲取顯示器大小
- 19. 如何獲得Emacs內部的解釋器解釋器?
- 20. 從shell調用python並捕獲輸出
- 21. Sublime Text用於運行插件的Python解釋器在哪裏?
- 22. 你如何找出python解釋器在python中的位置?
- 23. 如何捕獲流輸出Python從subprocess.communicate()
- 24. 獲取要顯示在Qt小部件中的子進程的標準輸出
- 25. 如何在Python/Tkinter中將StringVar連接到Text小部件?
- 26. 如何在Windows中隨時捕獲命令提示符的顯示輸出?
- 27. 在QTextEdit小部件中解析並顯示HTML
- 28. 在Python中捕獲Scapy函數輸出
- 29. Sublime Text 2 - 在解釋器中運行選定的python代碼
- 30. 如何捕獲MoinMoin解析器的輸出?
我喜歡你的建議。看起來很容易實現。但是,我需要爲它創建一個新的課程嗎?我的意思是,我可以在我的主窗口的同一個類中創建寫入功能嗎? –
@ dex19dt:你當然可以,但我會反對它,因爲它違反了單一責任原則。在我的代碼中,我創建了一個流類,該類的子類爲'QObject',並且具有'write()'發出的'textWritten'信號。然後,我只需將該信號連接到我的窗口中的一個插槽,該插槽將文本附加到「QTextEdit」中。優點:我可以格式化正常輸出和錯誤輸出。後者使用紅色文字顏色。 –
好的。所以我創建了另一個名爲stream.py的文件並粘貼你寫的代碼。我將它導入到主程序中,它不會引發任何錯誤,但它不會將文本插入到textEdit小部件中。我寫的函數很簡單'self.textEdit.append(str(text))'它錯了嗎? –