问题描述
最近在做一个用pyqt界面与检测算法结合的窗口软件项目,思路是通过登录界面的按钮实现多窗口跳转,在目标检测子窗口中检测图片按钮的槽函数如下所示,其功能实现对选择的图像送入模型并绘制目标框,然后回显到label中。在Debug时一切正常,但是run时却报标题所述错误代码。
一、最初出问题的代码:
img = Image.open(self.fname)
img = img.convert('RGB')
pred = self.model.detect_image(img)
pred = ImageQt.ImageQt(self.pred)
self.label.setPixmap(QPixmap.fromImage(pred)) # 注意这两行代码,需要用这种方式来转换PIL与QPixmap格式
self.label.setScaledContents(True) # 图片自适应label大小
经网上查阅错误代码很有可能是指访问内存冲突。思来想去最终如此解决
二、解决方案:
img = Image.open(self.fname)
img = img.convert('RGB')
self.pred = self.model.detect_image(img) # 在构造函数中预定义一个pred属性,该对象是窗口类对象
self.pred = ImageQt.ImageQt(self.pred)
self.label.setPixmap(QPixmap.fromImage(self.pred)) # 注意这两行代码,需要用这种方式来转换PIL与QPixmap格式
# sleep(1)
self.label.setScaledContents(True) # 图片自适应label大小
将pred由槽函数的局部变量改为绑定到窗口对象上的类属性,运行就一切正常。
三、出错原因分析
之前的出错原因可能是由于pred是局部对象,在执行窗口程序时,执行完检测按钮的槽函数后局部变量就都回收了,造成回到主程序的时候label访问不到此前图片的内存,故报错。此是需要注意的点,此后的开发过程中应注意