【发布时间】:2016-10-27 11:08:30
【问题描述】:
我已经使用 PyQt4 开发一个科学应用程序已经有几个星期了,并决定切换到 PyQt5。除了要解决的几件事之外,还有一件事让我感到困惑,我不确定它是否是预期的行为。
使用 PyQt4 时: 如果我遇到 python 错误(AttributeError、FileNotFoundError 或其他),错误消息将打印到 python 控制台,但我可以继续使用 PyQt4 gui 应用程序
使用 PyQt5 时,当我遇到 python 错误时,整个应用程序都会关闭我。这是一个设置,还是这是预期的行为?如果出现错误,这可能像以前一样是灾难性的,我可以保存我获得的数据,但现在应用程序将在没有警告的情况下关闭。
这是一个演示该行为的示例。此脚本打开一个带有一个按钮的小部件,该按钮可激活文件对话框。如果选择了有效文件,代码会将文件指针对象打印到命令行。如果因为用户点击取消而没有选择文件,则不会处理这种情况,python 会尝试打开路径为 '' 的文件。在此 PyQt4 和 PyQt5 版本都抛出相同的 python 错误:
FileNotFoundError: [Errno 2] No such file or directory: ''
但是,PyQt4 版本将保持小部件打开,用户可以继续,而 PyQt5 版本关闭,退出代码为 1。
这里是示例代码,由“python script.py”执行
import sys
# from PyQt4 import QtGui as qt
# from PyQt4.QtCore import PYQT_VERSION_STR
from PyQt5 import QtWidgets as qt
from PyQt5.QtCore import PYQT_VERSION_STR
def open_a_file():
fname = qt.QFileDialog.getOpenFileName()
if PYQT_VERSION_STR[0] == '4':
f = open(fname, 'r')
print(f)
else:
f = open(fname[0], 'r')
print(f)
f.close()
if __name__ == '__main__':
app = qt.QApplication(sys.argv)
w = qt.QWidget()
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('PyQt 4 v 5')
btn = qt.QPushButton("Open a file", w)
btn.clicked.connect(open_a_file)
w.show()
sys.exit(app.exec_())
我可以使用 PyQt5,但它不会像 PyQt4 版本那样崩溃吗?
这里是我目前的系统信息系统信息:
Windows 7 64 位
蟒蛇,Python 3.5
PyQt4 --> 来自 conda 来源
PyQt5 --> 使用:
conda install --channel https://conda.anaconda.org/m-labs qt5
conda install --channel https://conda.anaconda.org/m-labs pyqt5
PyQt4 和 PyQt5 并排安装
【问题讨论】:
-
您有未捕获的异常:它们应该始终中止程序。如果你想抓住他们,你必须这样做。 PyQt4 的行为是错误的。当您运行任何 Python 程序并且有未捕获的异常时,它将中止。 PyQt 并不是要改变如此根本的东西。
-
我认为“错误”可能取决于您的观点。作为一个编写 python 来帮助研究而不是部署企业应用程序的人,我认为 PyQt4 的行为更符合我的目标,即把事情做好和快速,但不会有丢失数据的风险,也不会过于严格遵守编码约定和范式时,这种遵守需要的时间比我多。
-
带走
PyQt4,Python 默认会因异常而中止。所以这就是你应该期待的。如果您想改变这一点,就看您自己了:捕获异常很容易。您必须明确说明您想要什么; PyQt4 改变它是错误的,因为它让你认为(错误地!)做出这样的改变是它的工作。它不是。这是你的工作。你认为这不是你的工作的唯一原因是 PyQt4 的设计有一个愚蠢的错误。这个问题的存在就是那个错误的后果,并突出了它的错误程度。 /颤抖
标签: python qt pyqt pyqt4 pyqt5