![](/img/trans.png)
[英]PYQT: How to capture output of python's interpreter and display it in QEditText?
[英]PyQt: displaying Python interpreter output
我已經在我的代碼中實現了這個答案 ,我希望它能做我想要的。 但是,我正在通過QPushButton
上的連接運行一種方法,並且我想將此方法中發生的事情傳遞給GUI。
我第一次單擊該按鈕時, stdout
出現在解釋器窗口中。 但是,在隨后按下該按鈕時, stdout
出現在QTextEdit
-我認為print語句或QPushButton
存在一些我不理解的復雜性-如果有人可以在我需要開始更改我的位置的地方提供任何指針代碼我將永遠感激不已!
我認為這是我可以用來證明問題的最少代碼。
import os, sys
from PyQt4 import QtCore, QtGui
def main():
app = QtGui.QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
class MyWindow(QtGui.QWidget):
def __init__(self, *args):
QtGui.QWidget.__init__(self, *args)
self.runBtn = QtGui.QPushButton('Run!', self)
self.runBtn.clicked.connect(self.runCmd)
self.te = QtGui.QTextEdit()
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.runBtn)
layout.addWidget(self.te)
self.setLayout(layout)
def runCmd(self):
print "here"
print sys.stdout
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
def __del__(self):
sys.stdout = sys.__stdout__
def normalOutputWritten(self, text):
cursor = self.te.textCursor()
cursor.movePosition(QtGui.QTextCursor.End)
cursor.insertText(text)
self.te.setTextCursor(cursor)
self.te.ensureCursorVisible()
class EmittingStream(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text):
self.textWritten.emit(str(text))
if __name__ == "__main__":
main()
您正在將信號與方法調用混合:
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
我不確定這應該做什么。 您應該這樣做:
self.stream = EmittingStream()
self.stream.textWritten.connect(self.normalOutputWritten)
但啟動程序時只有一次。 當您想查看輸出時,請執行以下操作:
try:
sys.stdout = self.stream
... code to print something ...
finally:
sys.stdout = sys.__stdout__ # reset stdout to default
Aaron提出了一個很好的觀點,但是我的問題的答案比python中面向對象的復雜性要簡單得多。
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
需要在 任何打印語句之后-在此之前的打印語句將定向到標准stdout
,即解釋器控制台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.