0

私はこの答えを自分のコードに実装しました。ただし、 の接続を介してメソッドを実行しており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()
4

2 に答える 2

1

シグナルとメソッド呼び出しを混在させています。

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

これが何をすべきかわかりません。代わりにこれを行う必要があります。

self.stream = EmittingStream()
self.stream.textWritten.connect(self.normalOutputWritten)

ただし、プログラムを開始するときは 1 回だけです。出力を表示するには、次のようにします。

try:
   sys.stdout = self.stream

   ... code to print something ...
finally:
   sys.stdout = sys.__stdout__ # reset stdout to default
于 2013-11-07T15:15:54.257 に答える