我使用从QWidget
继承的自定义小部件。这个小部件可能使用一个在线资源:一张我从互联网下载的图片,在QLabel
实例中显示之前存储在本地文件中。
当用户关闭窗口时,我希望删除本地文件,所以我将析构函数更改为:
def __del__(self):
if os.path.isfile( self.pictureFilename):
os.remove( self.pictureFilename)
我有:
import os
在我剧本的开头。奇怪的是,当主应用程序关闭时,我得到了错误:
追踪(最近一次通话):
文件"/home/XX/XXX/XXX.py";,第103行,del
AttributeError:"NoneType"对象没有属性"path"
看起来库在调用析构函数之前就已经被垃圾收集了。我不知道该怎么解决。
查看github代码,问题似乎是当小部件关闭时,Qt应用程序终止并调用sys.exit(),因此模块可能在__del__
调用之前被垃圾收集。
那里:
if __name__ == '__main__':
app = QApplication( sys.argv)
url = "http://www.transfermarkt.co.uk/cristiano-ronaldo/profil/spieler/8198"
ex = PlayerWindow( url)
sys.exit( app.exec_())
为了避免这个问题,我建议使用closeEvent(event)
形式QWidgethttp://doc.qt.io/qt-5/qwidget.html#closeEvent
将您的__del__
功能替换为:
def closeEvent(self, event):
if os.path.isfile( self.pictureFilename):
os.remove( self.pictureFilename)
del self.profile
del self.pictureLabel
一般来说,您应该尽量避免使用__del__
自动完成带有垃圾回收的对象,而不在代码中显式调用del object
。