window 关闭后 PyQt 线程仍然 运行
PyQt thread still running after window closed
当我在 PyQt 中关闭应用程序 window 时,控制台仍留在后台 运行 并且 python.exe 进程存在,直到我关闭控制台。我认为 sys.exit(app.exec_())
无法正常运行。
Mainscript(先打开window):
if __name__ == '__main__':
from firstwindow import main
main()
第一window
按下按钮时:
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()(建议):
def main_window():
return form
def main():
global form
app = QtWidgets.QApplication(sys.argv)
form = MyApp()
form.show()
app.exec_()
sys.exit(app.exec_())
问题是您在 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 交互时暂停在那里。当您关闭顶层 window(或在应用程序上调用 quit()
)时,事件循环将停止,exec_()
将 return,而 main()
功能将继续。
但下一行调用 sys.exit(app.exec_())
, 重新启动 事件循环,并再次暂停 main()
函数 - 包括 sys.exit()
调用,必须等待 exec_()
到 return。但是,它将永远等待,因为现在没有可以与之交互的 gui,因此除了强行终止脚本之外,您无法停止事件循环。
当我在 PyQt 中关闭应用程序 window 时,控制台仍留在后台 运行 并且 python.exe 进程存在,直到我关闭控制台。我认为 sys.exit(app.exec_())
无法正常运行。
Mainscript(先打开window):
if __name__ == '__main__':
from firstwindow import main
main()
第一window
按下按钮时:
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()(建议
def main_window():
return form
def main():
global form
app = QtWidgets.QApplication(sys.argv)
form = MyApp()
form.show()
app.exec_()
sys.exit(app.exec_())
问题是您在 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 交互时暂停在那里。当您关闭顶层 window(或在应用程序上调用 quit()
)时,事件循环将停止,exec_()
将 return,而 main()
功能将继续。
但下一行调用 sys.exit(app.exec_())
, 重新启动 事件循环,并再次暂停 main()
函数 - 包括 sys.exit()
调用,必须等待 exec_()
到 return。但是,它将永远等待,因为现在没有可以与之交互的 gui,因此除了强行终止脚本之外,您无法停止事件循环。