如何使用Pyqt在另一个进程完成之后启动一个进程?

时间:2018-08-29 19:59:00

标签: python pyqt pyqt5 qprocess

我想使用Pyqt5运行几个cmd文件。我目前只能运行一个cmd文件...下面是代码片段:

def run(self):
    self.process = QProcess(self)
    self.process.started.connect(lambda: self.statusUpdate('Started'))
    self.process.finished.connect(lambda: self.statusUpdate('Finished'))
    self.process.start('test.cmd')

def statusUpdate(self, event):
    print(event)
    self.status = event

这是我要测试的简单cmd文件:

echo TEST
echo TEST
echo TEST
PAUSE

我注意到,即使cmd文件完成,它也永远不会打印“完成”

第一个完成后,如何启动另一个cmd文件?

1 个答案:

答案 0 :(得分:0)

为解决该问题,实现了一个类,该类按顺序执行命令,即,它结束一个任务并执行下一个任务,直到所有命令都被执行。

from PyQt5 import QtCore, QtWidgets
from functools import partial


class SequentialManager(QtCore.QObject):
    finished = QtCore.pyqtSignal()
    resultsChanged = QtCore.pyqtSignal(QtCore.QByteArray)

    def __init__(self, parent=None):
        super(SequentialManager, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.process.finished.connect(self.handleFinished)
        self.process.readyReadStandardOutput.connect(self.onReadyReadStandardOutput)

    def start(self, commands):
        self._commands = iter(commands)
        self.fetchNext()

    def fetchNext(self):
        try:
            command = next(self._commands)
        except StopIteration:
            return False
        else:
            self.process.start(command)
        return True

    def onReadyReadStandardOutput(self):
        result = self.process.readAllStandardOutput()
        self.resultsChanged.emit(result)

    def handleFinished(self):
        if not self.fetchNext():
            self.finished.emit()


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        vlay = QtWidgets.QVBoxLayout(self)
        self.te = QtWidgets.QTextEdit()
        self.te.setReadOnly(True)
        btn = QtWidgets.QPushButton("Start processes")
        vlay.addWidget(self.te)
        vlay.addWidget(btn)

        manager = SequentialManager(self)
        manager.resultsChanged.connect(self.onResultsChanged)

        commands = ["test1.cmd", "test2.cmd"]
        btn.clicked.connect(partial(manager.start, commands))

    def onResultsChanged(self, result):
        self.te.append(str(result, "utf-8"))


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())