python - QProcess没有调用完成?
问题描述
我尝试从子进程 Popen 阻止 PyQt GUI中实现建议,但似乎永远不会调用 onFinished 函数。
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
[...]
def Run_PnL_Script(self):
self.Run_PnL.setEnabled(False)
self.Run_PnL.setStyleSheet("background-color: #D3D3D3; color: #FFFFFF")
self.PnL_Status.setText("Running...")
process = QtCore.QProcess(self)
process.finished.connect(self.onFinished)
process.startDetached("cmd.exe", ["/c", "K:\Market Risk\Risk App\Batches\RTest.bat"])
def onFinished(self, exitCode, exitStatus):
self.PnL_Status.setText("Complete.")
self.Run_PnL.setEnabled(True)
self.Run_PnL.setStyleSheet("background-color: #4582EC; color: #FFFFFF")
[...]
在此先感谢您的帮助。
解决方案
您有 2 个错误:
- 当你在 cmd.exe 中执行完一个命令并不意味着你关闭了 cmd.exe,所以你必须在 .bat 的末尾使用 EXIT 命令来关闭它。
RTest.bat
:: Another commands
EXIT
- 不要使用
startDetached()
,因为这是一个静态方法,它创建一个不同于“进程”变量的内部 QProcess,您必须使用该start()
方法。
# ...
process = QtCore.QProcess(self)
process.finished.connect(self.onFinished)
process.start("cmd.exe", ["/c", "K:\Market Risk\Risk App\Batches\RTest.bat"])
推荐阅读
- javascript - 通过 jquery 或 js 添加 onchange 属性
- nlog - 将特定记录器的输出重定向到特定的 NLog 目标
- javascript - 为什么我的订阅中有错误?
- c# - 如何统一限制生成对象
- google-chrome - 为什么 `curl -i` 没有任何缓存标头?
- output - 在输出中,首先打印文本“Sum is :”,然后调用该函数。请检查此代码
- python - 我可以使用 python 装饰器根据输入类型预处理输入和后处理输出吗?
- angular - Prime ng自动完成虚拟滚动
- nodes - 复合梯形规则和标准正态分布所需的节点数
- c - C 编程错误:在 'move' 之前需要 '('