【问题标题】:Should I use `app.exec()` or `app.exec_()` in my PyQt application?我应该在我的 PyQt 应用程序中使用 `app.exec()` 还是 `app.exec_()`?
【发布时间】:2014-05-01 21:18:00
【问题描述】:

我使用 Python 3 和 PyQt5。这是我的测试 PyQt5 程序,关注最后两行:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys

class window(QWidget):
def __init__(self,parent=None):
    super().__init__(parent)
    self.setWindowTitle('test')
    self.resize(250,200)

app=QApplication(sys.argv)
w=window()
w.show()
sys.exit(app.exec())
#sys.exit(app.exec_())

我知道exec 是 Python 中的语言关键字。但是Official PyQt5 Documentation 上的代码(特别是Object Destruction on Exit 部分)。我看到该示例显示了 app.exec() 的使用,这让我感到困惑。

当我在我的机器上测试它时。我发现与我的结局没有任何明显的区别。无论有没有_,都会在没有时间差的情况下产生相同的输出。

我的问题是:

  • 当我使用app.exec() 时有什么问题吗?喜欢与 Python 内部的exec 发生冲突?我怀疑是因为exec 都在执行某些操作。
  • 如果不能,我可以同时使用两者吗?

【问题讨论】:

  • 在 PyQt5 中,你根本不需要 sys.exit()。单独使用app.exec_()app.exec() 就足够了,并且可以正常工作。他们在 PyQt5 的底层修复了一些东西,这样你就不再需要 sys.exit() 了。如果您希望您的代码在 PyQt4 上运行,请在此处设置sys.exit()。另外,app.exec_()app.exec() 是可以互换的,所以你可以使用任何你喜欢的。如果您希望您的代码也可以在 PyQt4 上运行,那么请坚持使用 app.exec_()。因此,底线是:要让您的代码在 PyQt5 PyQt4 上正常工作,请使用sys.exit(app.exec_())
  • @Boštjan Mejak.. 非常感谢您的评论和解释!肯定需要更多的赞成票!到目前为止,我发现的第一条评论解释了我在代码中注意到的这些细微差别。从 pyqt4 到 pyqt5 的变化就像再次学习阅读(不得不承认.. 10 年不编程让一个人有点生疏.. 并且 python 在引擎盖下也弹出了一些有趣的球)。
  • @BoštjanMejak:你确实需要sys.exit() 否则app.exit(1) 调用不会导致相应的退出状态,即,即使在Python 3 和PyQt5 上,使用sys.exit(app.exec())
  • 在 PyQt5 中,他们已经修复了 Qt 和 Python 停止进程的顺序,所以现在我们真的不需要再使用 sys.exit() 调用了。这一切都在 PyQt5 文档中进行了解释。
  • @BoštjanMejak:错误。这是minimal code example。顺便说一句,如果您希望我收到有关您的 cmets 的通知,请使用 \@ 语法。

标签: python qt python-3.x pyqt pyqt5


【解决方案1】:

这是因为在 Python 3 之前,execwas a reserved keyword,所以 PyQt 开发人员为其添加了下划线。从 Python 3 开始,execno longer a reserved keyword(因为它是一个内置函数;与print 的情况相同),因此在 PyQt5 中提供一个不带下划线的版本以与 C++ 文档保持一致是有意义的,但要保持带有下划线的版本,用于向后兼容。因此对于带有 Python 3 的 PyQt5,这两个 exec 函数是相同的。对于较旧的 PyQt,只有 exec_() 可用。

【讨论】:

  • PyQt6 不再支持exec_(),现在只支持exec()
【解决方案2】:

关于是否更喜欢一个的问题:使用exec_ 意味着如果您决定添加对 PyQt4 和/或 Python >= 2.6 的支持,并且想要维护一个单一代码库。

【讨论】:

  • 我认为你的意思是 Python = 2.6。)。
  • @FeRD。不,我的意思是exec_ 可以与 pyqt4 或 pyqt5 组合使用等于或大于 2.6 的任何 python 版本。 pyqt 不支持早期版本的 python。所以exec_ 与 pyqt4 和 pyqt5 以及任何版本的 python >= 2.6 都向前和向后兼容(不过,我怀疑 python-3.0.x 是否真的可行)。
【解决方案3】:

从 PyQt 6 开始,不再支持 app.exec_(),仅支持 app.exec()

因此,在构建新应用时,我只使用后者。

https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5

【讨论】:

  • 但是我应该怎么做呢?
  • 我已经澄清了我的答案。 OP 想知道是使用app.exec() 还是app.exec_()。由于不再支持app.exec_(),我只在新应用中使用app.exec()。它只是让事情变得更简单。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多