Python app.exec()返回后,关闭PyQT应用程序时出错

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

每次从QT按钮退出一个简单的PyQT GUI时,我都会看到一个错误:
必须首先构造一个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)