我已经在我的代码中实现了this answer,我希望能够做到我想要的。但是,我正在通过QPushButton
上的连接运行一个方法,我想将此方法中发生的事情传递给GUI。
我第一次点击按钮,stdout
出现在翻译窗口中;然而,在随后按下按钮时,stdout
中出现QTextEdit
- 我认为打印声明或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()
答案 0 :(得分:1)
您正在使用方法调用混合信号:
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
答案 1 :(得分:0)
Aaron提出了一个非常好的观点,但我的问题比python中面向对象的错综复杂得多一些答案......
sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)
在 任何打印语句之后需要 - 之前的print语句将被定向到标准stdout
,即解释器控制台。