我有一个非常复杂的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
?
答案 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
只会立即返回而不会阻塞。
(注意:显然你需要在普通的控制台中运行上面的脚本来正确测试它。)