You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:40:22