窗口关闭后 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 线程仍在运行的主要内容,如果未能解决你的问题,请参考以下文章