tutorial pil libreria python pyqt python-imaging-library

pil - Python PyQt pixmap update se bloquea



python pil github (1)

Tengo una aplicación PyQt simple. Puede recorrer una carpeta de imágenes usando las teclas de búsqueda y de búsqueda.

Estoy usando el mapa de píxeles de QLabel para mostrar las imágenes. La siguiente lógica realmente funciona hasta que comentes la llamada a processEvents.

¿Alguna idea sobre la causa del bloqueo y por qué agregar processEvents previene el bloqueo?

# 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_())


Probablemente, el error esté causado por la recolección de elementos no utilizados, ya que no mantiene una referencia explícita al objeto de imagen Qt. Cuando creas un mapa de píxeles a partir de una QImage, los datos subyacentes seguirán siendo compartidos, así que utiliza el constructor de copia QImage para obtener una referencia explícita y luego manténlo activo hasta que el mapa de puntos ya no sea necesario:

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

ACTUALIZAR :

Usando el caso de prueba, pude eliminar el bloqueo simplemente manteniendo una referencia al objeto ImageQt original:

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

O, más simplemente, usando QPixmap.detach () :

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