我想在pyqt5中创建一个窗口,然后关闭它。由于某种原因,关闭窗口后程序不会退出。它被卡住了。我一直在阅读几篇相关的帖子,但没有一个给出明确的答案。
我已经尝试过诸如“self.object.close()”,“app.quit()”,甚至“self.object.destroy()”之类的代码,但所有代码都以同样的方式工作。真正关闭窗口的唯一方法是单击窗口本身的x(关闭)。但这不是我需要的行为。我想用我的代码关闭窗口。
import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import pyqtSlot, pyqtSignal
class window(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 480, 300)
self.setWindowTitle('Hello World')
self.setWindowLayout()
def setWindowLayout(self):
self.w = QtWidgets.QWidget(self)
self.layout = QtWidgets.QHBoxLayout()
self.label = QtWidgets.QLabel('Hello World Label')
self.layout.addWidget(self.label)
self.w.setLayout(self.layout)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = window()
main_window.show()
main_window.close()
sys.exit(app.exec_())
一旦我使用main_window.close()
关闭窗口。我希望我的程序退出。
如果在不同的帖子中解决了这个问题我会道歉。我搜索了答案,没有人解决我的问题。
谢谢。
在我看来,它是一个bug,因为根据文档,如果没有顶级窗口应该关闭应用程序,但似乎没有验证窗口的关闭是否在事件循环开始之后。解决方法是使用QTimer.singleShot(0, ...)
关闭窗口:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class window(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(300, 300, 480, 300)
self.setWindowTitle('Hello World')
self.setWindowLayout()
def setWindowLayout(self):
self.w = QtWidgets.QWidget(self)
self.layout = QtWidgets.QHBoxLayout()
self.label = QtWidgets.QLabel('Hello World Label')
self.layout.addWidget(self.label)
self.w.setLayout(self.layout)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main_window = window()
main_window.show()
QtCore.QTimer.singleShot(0, main_window.close) # <---
sys.exit(app.exec_())