Python 清除QTreeWidget时PyQt5 GUI崩溃

Python 清除QTreeWidget时PyQt5 GUI崩溃,python,pyqt5,Python,Pyqt5,当#从下面代码中的行中删除时,为什么单击按钮时GUI会崩溃 代码中的行是: self.treeWidget.currentItemChanged.connect(self.current_选择) 如果有人能向我解释发生了什么,我将不胜感激。默认情况下,如果没有选择,currentItem()是树中的第一项 单击按钮时,将调用self.treeWidget.clear()。所有项目都从树小部件中删除,因此不再有第一个项目:发出信号currentItemChanged 如果树中没有任何内容,self

当#从下面代码中的行中删除时,为什么单击按钮时GUI会崩溃

代码中的行是:

self.treeWidget.currentItemChanged.connect(self.current_选择)


如果有人能向我解释发生了什么,我将不胜感激。

默认情况下,如果没有选择,
currentItem()
是树中的第一项

单击按钮时,将调用self.treeWidget.clear()。所有项目都从树小部件中删除,因此不再有第一个项目:发出信号
currentItemChanged

如果树中没有任何内容,
self.treeWidget.currentItem()
将返回
None
。在
当前选择中
,这就是为什么您会得到:

AttributeError:“非类型”对象没有属性“文本”

要解决此问题,您可以在继续之前测试
是否为

def current_selection(self):
    item = self.treeWidget.currentItem()
    if item is not None:
        self.no = item.text(0)
        self.colour = item.text(1)
        self.animal = item.text(2)
    ...

回答特定问题:GUI为什么会崩溃

这是由于PyQt-5.5引入了新的行为。引用PyQt5文档:

在PyQt v5.5中,未经处理的Python异常将导致调用 Qt的qFatal()函数。默认情况下,这将调用abort()和 申请将终止。请注意,安装了一个应用程序 异常钩子仍然优先

幸运的是,正如最后一句所指出的,通过安装,可以绕过这种新行为,这将允许您的程序以更优雅的方式处理未处理的异常

作为最低要求,简单地将回溯打印到stdout/stderr的旧行为可以恢复如下:

def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)

if __name__ == "__main__":

    import sys
    sys.excepthook = except_hook
但是很明显,在某种消息框中显示错误将是一种更可取的方式来通知用户问题已经发生

def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)

if __name__ == "__main__":

    import sys
    sys.excepthook = except_hook