PyQt5报错QCoreApplication::exec:事件循环已运行的解决方案求助
解决PyQt5事件循环重复运行错误(QCoreApplication::exec: The event loop is already running)
错误原因
PyQt5要求整个应用只能存在一个QApplication实例,且事件循环exec_()只能启动一次。你的代码中:
main.py创建了QApplication并启动事件循环main_design.py的main()函数再次调用app.exec_(),触发重复启动事件循环的报错
具体解决方案
1. 移除所有多余的app.exec_()调用
- 修改
main_design.py,删除main()函数中的app.exec_():
def sendFile(passedFileName): global fileName fileName = passedFileName def main(parent=None): Frame = QtWidgets.QFrame(parent) player = VideoPlayer(parent) player.resize(1024, 864) ui = Ui_Frame() ui.setupUi(Frame, player) player.show() Frame.show() player.playVideoFile(fileName) return Frame, player if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) sendFile("./outputs/output.avi") main() app.exec_()
- 删除
VideoPlayer.py中无用的main()函数:
def playVideoFile(self, fileName): if fileName != '': self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName))) if self.mediaPlayer.state() == QMediaPlayer.PlayingState: self.mediaPlayer.pause() else: self.mediaPlayer.play() # 移除以下无用代码 # def main(): # app.exec_() # return app # # if __name__ == "__main__": # main()
2. 重构全局变量传递逻辑,避免传递QApplication实例
全局传递QApplication容易引发状态冲突,改为直接传递必要参数(如文件名):
- 修改
trackerProcess.py的start_process_three方法:
def start_process_three(self): main_design.sendFile("./outputs/output.avi") # 直接创建窗口,无需依赖全局app main_design.main()
- 移除
trackerProcess.py和main_design.py中全局的app变量。
3. 确保main.py是唯一的应用入口
保持main.py中仅创建一次QApplication并启动事件循环:
import sys from PyQt5.QtWidgets import QApplication import subprocess import TrackerProcess def main(): app = QApplication(sys.argv) # 用subprocess安全执行外部命令,替代字符串调用 subprocess.run(["python", "save_model.py", "--model", "yolov4"], check=True) subprocess.run(["python", "object_tracker.py", "--video", "./data/video/project_video_2.mp4", "--output", "./outputs/output.avi", "--model", "yolov4", "--dont_show", "--count"], check=True) TrackerProcess.main() app.exec_() if __name__ == '__main__': main()
额外新手建议
- 尽量避免全局变量,改用函数参数或类属性传递数据,降低代码耦合度
- PyQt控件创建时指定父控件,让Qt自动管理控件生命周期,避免内存泄漏
- 执行外部命令优先使用
subprocess模块,比直接字符串调用更安全可控
内容的提问来源于stack exchange,提问作者Fc0001
相关产品推荐
相关产品推荐

