窗口关闭后 PyQt 线程仍在运行

Posted

技术标签:

【中文标题】窗口关闭后 PyQt 线程仍在运行【英文标题】:PyQt thread still running after window closed 【发布时间】:2015-11-13 20:29:01 【问题描述】:

当我在 PyQt 中关闭应用程序窗口时,控制台仍然在后台运行,并且 python.exe 进程一直存在,直到我关闭控制台。我认为sys.exit(app.exec_()) 无法正常运行。

Mainscript(打开 Firstwindow):

if __name__ == '__main__':
    from firstwindow import main
    main()

第一个窗口

按下按钮时:

    self.close() #close firstprogram
    Start() #function to open mainprogram

开始():

def Start():
        global MainWindow
        MainWindow = QtWidgets.QMainWindow()
        ui = genui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()

main()(建议here):

def main_window():
     return form

def main():
    global form
    app = QtWidgets.QApplication(sys.argv)  
    form = MyApp()  
    form.show()
    app.exec_()
    sys.exit(app.exec_())

【问题讨论】:

为什么要连续两次启动应用程序?第二次调用exec_() 时,它只会坐在那里无所事事,并且您将无法与它进行交互,因为您已经关闭了主窗口。去掉第一行app.exec_() @ekhumoro 成功了,您可以将其发布为答案。但是,我想知道第二次调用 exec 的位置,因为我不明白。不是 exec 告诉 qt 的引擎处理程序的运行,然后我将 exec 放入 sys.exit 告诉脚本在 Qt 这么说时退出? 【参考方案1】:

问题是你在main()函数中调用了两次exec_()

def main():
    global form
    app = QtWidgets.QApplication(sys.argv)  
    form = MyApp()  
    form.show()
    app.exec_()
    sys.exit(app.exec_())

第一行app.exec_() 将启动一个事件循环,这意味着main() 函数将在您与gui 交互时暂停。当您关闭顶层窗口(或在应用程序上调用quit())时,事件循环将停止,exec_() 将返回,main() 函数将继续。

但是下一行调用sys.exit(app.exec_()),它重新启动事件循环,并再次暂停main()函数——包括sys.exit()调用,它必须等待exec_()返回。但是,它将永远等待,因为现在没有 gui 可以与之交互,因此除了强制终止脚本之外,您无法停止事件循环。

【讨论】:

以上是关于窗口关闭后 PyQt 线程仍在运行的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 窗口在运行几秒钟后自动关闭 - “进程以退出代码 -1073741819 (0xC0000005) 完成”

PyQt 窗口在打开后立即关闭

关闭后 JavaFX 应用程序仍在运行

如何使用线程自动关闭 PyQt/PySide 窗口?

Pyqt5 - 文件对话框GUI关闭后无法运行代码

关闭 QMainWindow 的正确方法