如何使用 Pyqt 在一个进程完成后启动一个进程?
How to use Pyqt to start one process after another finishes?
我想 运行 使用 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 文件完成,它也不会打印 'Finished'
如何在第一个 cmd 文件完成后启动另一个 cmd 文件?
为了解决这个问题,实现了一个class顺序执行命令,即结束一个任务执行下一个任务,直到所有命令都执行完。
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_())
我想 运行 使用 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 文件完成,它也不会打印 'Finished'
如何在第一个 cmd 文件完成后启动另一个 cmd 文件?
为了解决这个问题,实现了一个class顺序执行命令,即结束一个任务执行下一个任务,直到所有命令都执行完。
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_())