我使用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中的一个关键字。但是官方PyQt5文档 * 上的代码(特别是Object Destruction on Exit部分)*。我看到这个例子显示了app.exec()
的使用,这让我很困惑。
当我在我的机器上测试的时候。我发现从我的Angular 看没有任何明显的区别。无论有没有_
,都能在没有时间差的情况下产生相同的输出。
我的问题是:
- 使用
app.exec()
时有什么问题吗?比如与Python内部的exec
冲突?我怀疑是因为两个exec
都在执行一些东西。 - 如果没有,我可以两者互换使用吗?
3条答案
按热度按时间ca1c2owp1#
这是因为在Python 3之前,
exec
是一个保留关键字,所以PyQt开发人员为其添加了下划线。从Python 3开始,exec
不再是保留关键字(因为它是一个内置函数;与print
相同的情况),因此在PyQt 5中提供一个没有下划线的版本以与C++文档保持一致,但保留一个带有下划线的版本以向后兼容。所以对于PyQt 5和Python 3,这两个exec
函数是相同的。对于旧版PyQt,只有exec_()
可用。gcuhipw92#
为了完整起见,以下是目前的情况(截至2023年10月):
exec
exec
和exec_
exec
和exec_
exec_
还应该指出的是,这会影响除了
QApplication
之外的许多其他类-例如QMenu
,QDialog
,QThread
等。所以,向前看,不再需要使用
exec_
-除非你想支持PySide 2,或者下面提到的过时的Qt和Python版本。(NB:标准Qt 5 LTS支持已于2023年5月终止,但commercial support has been extended to May 2025。然而,Qt 5的使用寿命很可能会超过这一点,因为KDE is still back-porting patches在最初的Qt开源许可证下)。
更新:
由于PyQt 4/Qt 4和Python 2现在已经过时了,下面的部分答案不再相关:
关于是否更喜欢其中一个的问题:使用
exec_
意味着如果你决定添加对PyQt 4和/或Python >= 2.6的支持,并且想要维护一个单一的代码库,那么你就少了一件需要担心的事情。pu3pd22g3#
从PyQt 6开始,不再支持
app.exec_()
,只支持app.exec()
。因此,在构建新应用程序时,我只使用后者。
https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5