我想使用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文件?
答案 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_())