在我的PyQt应用中应该使用`app.exec()`还是`app.exec_()`?
我使用的是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文档中,特别是退出时对象销毁的部分,看到的例子中使用了app.exec()
,这让我有点困惑。
我在我的机器上测试了一下,发现无论是用app.exec()
还是不加下划线的app.exec
,输出结果没有任何可见的区别,时间上也没有差别。
我的问题是:
- 使用
app.exec()
时是否有什么问题?会不会和Python内部的exec
冲突?我怀疑因为这两个exec
都在执行某些东西。 - 如果没有,我可以互换使用这两个吗?
3 个回答
从PyQt 6开始,app.exec_()
这个方法不再被支持了,现在只能使用app.exec()
。
所以,在创建新应用的时候,我只会用后者。
https://www.riverbankcomputing.com/static/Docs/PyQt6/pyqt5_differences.html?highlight=pyqt5
为了让大家更清楚,这里是截至2023年10月的最新情况:
- PyQt6:只支持
exec
- PySide6:同时支持
exec
和exec_
- PyQt5:同时支持
exec
和exec_
- PySide2:只支持
exec_
还要指出的是,这个情况不仅影响 QApplication
类,还影响很多其他类,比如 QMenu
、QDialog
、QThread
等等。
所以,往后就不需要再使用 exec_
了,除非你想支持 PySide2,或者下面提到的过时版本的 Qt 和 Python。
(注意:标准的 Qt5 LTS 支持在2023年5月结束,虽然 商业支持延长到2025年5月。不过,Qt5 的实际使用寿命可能会超过这个时间,因为 KDE 仍在根据原始的 Qt 开源许可证进行补丁回溯。)
更新:
由于 PyQt4/Qt4 和 Python2 现在已经过时,下面这部分内容就不再相关:
关于是否偏好使用其中一个的问题:使用
exec_
意味着如果你决定添加对 PyQt4 和/或 Python >= 2.6 的支持,你就少了一件需要担心的事情,并且可以保持代码的统一。
这是因为在Python 3之前,exec
是一个保留关键字,所以PyQt的开发者在它后面加了个下划线。从Python 3开始,exec
就不再是保留关键字了(因为它是一个内置函数,和print
的情况一样),所以在PyQt5中,提供了一个没有下划线的版本,以便和C++的文档保持一致,同时为了向后兼容,保留了带下划线的版本。因此,在使用Python 3的PyQt5中,这两个exec
函数是一样的。而在旧版的PyQt中,只有exec_()
这个版本可用。