メイン ウィンドウ ラッパー クラス (たとえば A) と、ラッパーで使用される別のクラス (たとえば B) があります。B には、subprocess.check_call(command) 呼び出しを順番に持つメソッドがあります。このプロセスと通信し、メイン ウィンドウ QTextEdit に Qprocess stdout と stderr を表示し、メイン ウィンドウ QLineEdit から Qprocess stdin にデータを送り返すために、QProcess を使用するように変更しています。
そのために私は持っています:
class A(....):
def __init__(self):
....
QtCore.QObject.connect(self.ui.actionNew, QtCore.SIGNAL("triggered()", self.selectedNew)
self.qprocess = QtCore.QProcess()
self.connect(self.qprocess, QtCore.SIGNAL("readyReadStandardOutput()", self.readStdOut)
self.connect(self.qprocess, QtCore.SIGNAL("readyReadStandardError()", self.readStdErr)
def readStdOut(self):
self.ui.text_edit.append(QtCore.QString(self.qprocess.readAllStandardOutput()))
def readStdErr(self):
self.ui.text_edit.append(QtCore.QString(self.qprocess.readAllStandardError()))
def selectedNew(self:)
...
newB = B(self.qprocess)
newB.doWork(params)
class B():
def __init__(self, qprocess):
self.qp = qprocess
def doWork(params):
...
# creating a thread to not block the main thread
class ConsoleThread(threading.Thread):
def __init__(self, qprocess):
self.tqp = qprocess
threading.Thread.__init__(self)
def run(self):
self.qtp.execute("script_that_waits_for_user_input_during_execution")
# starting the thread and passing it the QProcess instance from B
ConsoleThread(self.qp).start()
print(self.qp.state()) # this returns 0, when I expected 2, obviously something wrong
最後に、「script_that_waits_for_user_input_during_execution」の出力はQTextEditに表示されませんが、コンソールにはまだ出力されています。A に信号が返されていないようで、 A.readStdOut() メソッドに到達していません。一般的な考え方は、さまざまなコマンド ライン スクリプトをラップする GUI アプリを用意することです。したがって、QProcess から出力を正しく取得し、GUI から書き込むことで通信できるようにする方法が必要です。もちろん、関数を B から A に移動すれば (不要な手順がなくなるため)、おそらくそれほど複雑ではないかもしれませんが、同時に、GUI ラッパーはロジックから分離する必要があると思います。
ありがとう!