Vin*_* W. 7 python qt pyqt pyqt4 pyqt5
我使用PyQt4开发了几个星期的科学应用程序,并决定切换到PyQt5.除了一些要解决的问题之外,有一件事令我困惑,我不确定它是否有预期的行为.
当使用PyQt4:如果我有一个python错误(AttributeError,FileNotFoundError或其他),错误消息将打印到python控制台,但我可以继续使用PyQt4 gui应用程序
当使用PyQt5时,当我有一个python错误时,整个应用程序关闭我.这是一个设置,还是这个预期的行为?这可能是灾难性的,如果有错误,我可以保存我已经获得的数据,但现在应用程序将在没有警告的情况下关闭.
这是一个演示行为的示例.此脚本打开一个小部件,其中包含一个用于激活文件对话框的按钮.如果选择了有效文件,代码将把filepointer对象打印到命令行.如果由于用户点击取消而没有选择文件,则不处理该情况并且python尝试打开具有路径''的文件.在这个PyQt4和PyQt5版本中抛出相同的python错误:
FileNotFoundError: [Errno 2] No such file or directory: ''
Run Code Online (Sandbox Code Playgroud)
但是,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_())
Run Code Online (Sandbox Code Playgroud)
我可以使用PyQt5,但它不会像PyQt4版本那样崩溃吗?
这是我目前的系统信息系统信息:
Windows 7 64位
Anaconda,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
Run Code Online (Sandbox Code Playgroud)
PyQt4和PyQt5都是并排安装的
通过调用此代码可以强制执行旧行为,我在搜索后找到了该代码. 我不确定我理解为什么这是需要弃用的不良行为,但这确实有效.
我认为这不应该是默认行为,并且正确捕获异常是正确的编程方式,但鉴于我编程的具体目的和时间限制,我发现访问作为可选模式很有用,因为我仍然可以看到打印到控制台的python异常跟踪,并且由于未捕获的异常而不会丢失任何未保存的数据.
import sys
def my_excepthook(type, value, tback):
# log the exception here
# then call the default handler
sys.__excepthook__(type, value, tback)
sys.excepthook = my_excepthook
Run Code Online (Sandbox Code Playgroud)