【问题标题】:PyQt app.exec() seems to be non-blockingPyQt app.exec() 似乎是非阻塞的
【发布时间】:2017-10-11 15:20:39
【问题描述】:

我有一个相当复杂的 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 会同时打印 strong>(由于spyder/utils/ipython/start_kernel.py 中出现错误)。我的问题是,为什么会打印这个错误,因为我认为 app.exec_() 是一个阻塞调用,并且在应用程序以某种方式退出之前不会返回状态。这是因为 Spyder 运行了自己的QApplication吗?

【问题讨论】:

  • 如果在运行应用程序之前运行 %gui qt5 会发生什么?
  • 嗨 Carlos,我听从了你关于我之前遇到的问题的建议,并将 Ipython shell 的设置更改为自动。即使我手动运行%gui qt5,错误仍然存​​在(它是著名的KeyError,因为__file__ 不在locals() 中)
  • @CarlosCordoba 是否已经存在关于潜在错误的未解决问题?或者这更像是一个非问题?

标签: python pyqt spyder


【解决方案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 会立即返回而不会阻塞。

(注意:显然您需要在普通控制台中运行上述脚本才能正确测试它)。

【讨论】:

  • 这完全有道理。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2023-03-11
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2014-04-12
  • 2011-12-30
相关资源
最近更新 更多