PyQt app.exec()似乎是非阻塞的

时间:2017-10-11 15:20:40

标签: python pyqt spyder

我有一个非常复杂的PyQt应用程序(Qt5,在Spyder中运行),最后我做了

def main():
    from PyQt5 import QtWidgets
    if not QtWidgets.QApplication.instance():
        app = QtWidgets.QApplication(sys.argv)
    else:
        app = QtWidgets.QApplication.instance() 
    main_window = MainWindow()
    main_window.show()
    status = app.exec_()
    print status
    sys.exit(0)

if __name__ == "__main__":
    main()

(由于this(第二个答案)需要if-else检查。)当我运行此代码时,我的应用显示,状态代码-1处打印同一时间(由于spyder/utils/ipython/start_kernel.py中出现错误)。我的问题是,为什么会出现这个错误,因为我认为app.exec_()是一个阻塞调用,并且在应用程序以某种方式退出之前不会返回状态。这是因为Spyder运行自己的QApplication

1 个答案:

答案 0 :(得分:1)

不可能多次执行应用程序事件循环。这很容易用一个简单的脚本进行测试:

import sys
from PyQt5 import QtCore, QtWidgets

app = QtWidgets.QApplication(sys.argv)
btn = QtWidgets.QPushButton('Test')
btn.clicked.connect(lambda: print(QtWidgets.QApplication.exec_()))
btn.show()
sys.exit(app.exec_())

输出:

QCoreApplication::exec: The event loop is already running
-1

因此,如果事件循环已在运行,exec只会立即返回而不会阻塞。

(注意:显然你需要在普通的控制台中运行上面的脚本来正确测试它。)