2017-10-11 246 views
2

我有一个相当复杂的PyQt的应用程序(QT5,在Spyder的运行),在此,我到底做PyQt的app.exec()似乎是无阻塞

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() 

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

+0

如果您在运行应用程序之前运行'%gui qt5',会发生什么? –

+0

嗨,卡洛斯,我跟着你的意见,关于我以前的问题,并将Ipython shell的设置更改为自动。即使我手动运行'%gui qt5',错误仍然存​​在(这是着名的'KeyError',因为'__file__'不在'locals()'中) – Dschoni

+0

@CarlosCordoba是否已经有一个公开的问题,关于底层错误?或者这更像是一个非问题? – Dschoni

回答

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只是立即返回而不阻塞。 (注意:你需要在普通的控制台上运行上面的脚本来正确测试它)。

+0

这是完全有道理的。谢谢。 – Dschoni

相关问题