0

我已经在我的代码中实现了这个答案,我希望它能做我想做的事。但是,我正在通过 a 上的连接运行一个方法QPushButton,并且我想将此方法中发生的事情通过管道传输到 GUI。

我第一次单击按钮时,会stdout出现在解释器窗口中;但是,在随后按下按钮时,stdout出现在- 我认为 print 语句或我不明白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()
4

2 回答 2

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
于 2013-11-07T15:15:54.257 回答
0

Aaron 提出了一个很好的观点,但我的问题的答案比 python 中面向对象的复杂性要简单得多......

sys.stdout = EmittingStream(textWritten=self.normalOutputWritten) 

需要 任何打印语句之后 - 在此之前的打印语句将被定向到标准stdout,即解释器控制台。

于 2013-11-07T16:03:44.023 回答