Python app.exec()返回后,关闭PyQT应用程序时出错
每次从QT按钮退出一个简单的PyQT GUI时,我都会看到一个错误:Python app.exec()返回后,关闭PyQT应用程序时出错,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,每次从QT按钮退出一个简单的PyQT GUI时,我都会看到一个错误:必须首先构造一个QGUI应用程序。该错误发生在运行应用程序一段时间后,但仅当单击一个按钮触发QT.quit()。如果通过关闭窗口停止应用程序,则不存在错误。到目前为止,我只在Ubuntu Artful上进行了测试,使用的是来自Ubuntu的PyQT包 最简单的应用程序是: test.py 输出 该错误发生在app.exec()完成之后,但在main()返回之前 是否需要执行其他操作才能干净地关闭PyQT?为了将大部分功能保留在m
必须首先构造一个QGUI应用程序。
该错误发生在运行应用程序一段时间后,但仅当单击一个按钮触发QT.quit()
。如果通过关闭窗口停止应用程序,则不存在错误。到目前为止,我只在Ubuntu Artful上进行了测试,使用的是来自Ubuntu的PyQT包
最简单的应用程序是:
test.py
输出
该错误发生在app.exec()
完成之后,但在main()
返回之前
是否需要执行其他操作才能干净地关闭PyQT?为了将大部分功能保留在
main()
中,最好的解决方案是将QGUI应用程序()移到所有功能之外:
#!/usr/bin/env python3
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
import PyQt5.QtQml as QtQml
def main(app):
''' setup and run the application '''
# Create a QML engine.
engine = QtQml.QQmlApplicationEngine(parent=app)
engine.load(QtCore.QUrl('test.qml'))
app.exec()
return
if __name__ == '__main__':
# Create the application instance.
app = QtGui.QGuiApplication(sys.argv)
main(app)
这很简单,但我仍然想知道如何完全关闭PyQT。我认为问题在于,事件循环中仍有事件试图在app.exec()
返回后运行,但我还没有找到如何让它们运行到完成和停止
感谢eyllanesc的帮助。一个解决方案是将应用程序定义为全局变量:
app=None
def main():
全局应用程序app=QtGui.qgui应用程序([])
谢谢@eyllanesc,它消除了错误。但这是一种笨拙的方式。我关闭QT的过程中是否遗漏了什么?发生的情况是,应用程序是一个局部变量,python需要删除它,但在您的情况下,作为一个局部应用程序,它已经被删除。我把它直接放在主文件的部分,如果
,我的意思是:如果
,如果
,如果
,如果,如果:导入sys app=QtGui.QGuiApplication([])engine=QtQml.QQmlApplicationEngine()engine.load(QtCore.QUrl('test.qml'))sys.exit(app.exec())
import QtQuick 2
import QtQuick.Controls 1.4
ApplicationWindow {
id: main_window
visible: true
Button {
text: "Quit"
onClicked: Qt.quit()
}
}
a
Must construct a QGuiApplication first.
b
#!/usr/bin/env python3
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
import PyQt5.QtQml as QtQml
def main(app):
''' setup and run the application '''
# Create a QML engine.
engine = QtQml.QQmlApplicationEngine(parent=app)
engine.load(QtCore.QUrl('test.qml'))
app.exec()
return
if __name__ == '__main__':
# Create the application instance.
app = QtGui.QGuiApplication(sys.argv)
main(app)