PyQt:显示Python解释器输出

时间:2013-11-07 14:40:29

标签: python pyqt4

我已经在我的代码中实现了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()

2 个答案:

答案 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,即解释器控制台。