Python PyQt像素图更新崩溃

o鱼

我有一个简单的PyQt应用程序。您可以使用pageup和pagedown键在图像文件夹中循环。

我正在使用QLabel的像素图显示图像。在您注释processEvents调用之前,以下逻辑实际上是有效的。

python崩溃

关于崩溃原因的任何想法以及为什么添加processEvents可以防止崩溃?

# Python version: 2.7.9 
# Qt version: 4.8.6
# PyQt version: 4.11.3

import sys
import os 
from PIL import Image
from PIL import ImageOps
from PIL.ImageQt import ImageQt
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4 import Qt

imagefolder = "C:/Users/alan/Desktop/imagefolder"

class QExampleLabel (QtGui.QLabel):
    def __init__(self, parentQWidget = None):
        super(QExampleLabel, self).__init__(parentQWidget)
        self.initUI()

    def initUI (self):

        self.imagelist = []

        for path, subdirs, files in os.walk(imagefolder):
            path = path.replace("\\", "/") 
            for file in files:
                base, ext = os.path.splitext(file)
                if ext.lower() == ".jpg":
                    jpg = path + "/" + file
                    self.imagelist.append(jpg)

        self.i = -1

    def keyPressEvent(self, keyevent):
        event = keyevent.key()
        if event == QtCore.Qt.Key_PageUp:
            self.backward()
        if event == QtCore.Qt.Key_PageDown:
            self.forward()

    def forward(self):
        self.i = self.i + 1
        if self.i >= len(self.imagelist):
            self.i = len(self.imagelist) - 1
        self.displayimage()

    def backward(self):    
        self.i = self.i - 1
        if self.i < 0:
            self.i = 0
        self.displayimage()

    def displayimage(self):   
        photo = self.imagelist[self.i]
        img = Image.open(photo)
        mysize = (260,260)
        method = Image.NEAREST if img.size == mysize else Image.ANTIALIAS
        self.cropimage = ImageOps.fit(img, mysize, method = method, centering = (0.5,0.5)) 
        qim = ImageQt(self.cropimage)
        pix = QtGui.QPixmap.fromImage(qim)
        self.setPixmap(pix)  
        QtGui.QApplication.processEvents()  # comment this line to see setPixmap crash

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myQExampleLabel = QExampleLabel()
    myQExampleLabel.show()
    myQExampleLabel.resize(260,260)
    sys.exit(app.exec_())
ekhumoro

该错误可能是由垃圾回收引起的,因为您没有保留对Qt图像对象的显式引用。从QImage创建像素图时,基础数据将保持共享状态,因此请使用QImage复制构造函数获取显式引用,然后将其保持活动状态,直到不再需要该像素图为止:

self._img = QtGui.QImage(qim)
pix = QtGui.QPixmap.fromImage(self._img)

更新

使用测试用例,我只需保留对原始ImageQt对象的引用就可以消除崩溃

self.qim = ImageQt(self.cropimage)
pix = QtGui.QPixmap.fromImage(self.qim)
self.setPixmap(pix)

或者,更简单地说,通过使用QPixmap.detach()

qim = ImageQt(self.cropimage)
pix = QtGui.QPixmap.fromImage(qim)
pix.detach()
self.setPixmap(pix)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PyQt5:通过另一个线程的信号发送像素图时,Python有时会因SIGSEGV崩溃

来自分类Dev

Python Matplotlib频率像素图

来自分类Dev

通过滑块更新图(python)

来自分类Dev

Python使用精确的像素大小保存matplotlib图

来自分类Dev

Python PyQt小部件以像素为单位定位

来自分类Dev

将Matplotlib图嵌入Tkinter在Python 3.5上崩溃

来自分类Dev

Python matplotlib:显示后无法更新图

来自分类Dev

Python - 基于计时器更新图

来自分类Dev

Python:更新图而不是创建一个新图

来自分类Dev

在Ubuntu上导入PyQt4.QtDeclarative或PyQt4.Qt时,Python 2.7崩溃

来自分类Dev

是否可以在Python(Spyder)中更新内联图?

来自分类Dev

Python Matplotlib 在画布中更新条形图

来自分类Dev

Windows上的Python 3.4:PyQt:仅在某些计算机上退出时崩溃

来自分类Dev

关闭PyQt4 Gui应用程序后,Python内核崩溃

来自分类Dev

使用Matplotlib,PyQt和Threading进行实时绘图会导致python崩溃

来自分类Dev

除非先选择值,否则 Python/PyQT 输入字段在自动完成期间崩溃

来自分类Dev

Pycharm Python崩溃

来自分类Dev

Python编译代码崩溃

来自分类Dev

Python/Kivy 立即崩溃

来自分类Dev

使QLabel的像素图透明

来自分类Dev

定性热图图python

来自分类Dev

Python(孪生图)古怪图

来自分类Dev

终端和软件更新在打开时发生崩溃,与python安装有关

来自分类Dev

python中的重复图

来自分类Dev

python上的多个图

来自分类Dev

用python保存图

来自分类Dev

循环的python子图

来自分类Dev

Python Tkinter图

来自分类Dev

热图Python