我正在使用Python和Qt通过PySide为数据可视化编程GUI应用程序。 我偶尔会遇到崩溃('python.exe已经停止工作'),我认为我已经缩小到以下问题:
当从numpy数组创建pixmap时,即使pixmap已经存在,内存也会被python(?)释放。 如果使用的图像格式为QImage.Format_ARGB32,则不会发生这种情况。(为什么不呢?)。看看下面的代码示例,我希望你能重现这个问题。
编辑:澄清 - 如果python没有删除numpy数组,一切都按预期工作。但是,在我的应用程序中,不断生成新数据,我必须找到一种很好的方法来跟踪当前显示为像素图的数据集,并在它不再显示时立即将其删除。我想找到正确的方法让Qt处理(图像)数据并将其存储在内存中,直到不再需要为止。
据我了解Qt和PySide的文档,pixmap应该包含图像的所有数据,因此Qt应该负责内存管理。
这是Qt,Pyside中的错误,还是我不明白?我在常规文档中找不到有关内存管理的任何细节。
背景:我需要定期更新要显示的数据,因此可能会发生在创建像素图并显示它之间,numpy数据数组已被python覆盖(因为涉及一些CPU密集型线程有时会减慢GUI)。因此,永远存储numpy数组不是一种选择。
这是一个代码示例,有趣的位发生在display_image
方法中:
import numpy as np
from PySide import QtCore, QtGui
import sys
class displaywidget(QtGui.QWidget):
def __init__(self,parent = None):
super(displaywidget, self).__init__(parent)
## set up the GUI elements
self.setLayout(QtGui.QGridLayout())
self.view = QtGui.QGraphicsView()
self.layout().addWidget(self.view)
self.scene = QtGui.QGraphicsScene()
self.view.setScene(self.scene)
# create a pixmap and display it on the graphicsview
self.display_image()
def display_image(self):
# create image data in numpy array
size = 1024
r = np.linspace(0,255, num = size**2, dtype = np.uint32)
argb = (r<<16) +(255<<24)
# image should display a black to red shading
image = QtGui.QImage(argb, size,size, size*4, QtGui.QImage.Format_RGB32)
### using ARGB format option does not cause the problem
# image = QtGui.QImage(argb, size,size, size*4, QtGui.QImage.Format_RGB32)
pixmap = QtGui.QPixmap.fromImage(image)
self.scene.addPixmap(pixmap)
### when the image data is stored, everything works fine, too
# self.cache = argb
### if only the pixmap and image is stored, the problem still exists
# self.cache = [pixmap, image]
def main(argv):
## create application and main window
try:
app = QtGui.QApplication(argv)
new_qtapp = True
except:
new_qtapp = False
mainwindow = QtGui.QMainWindow()
mainwindow.setCentralWidget(displaywidget())
mainwindow.show()
if new_qtapp:
sys.exit(app.exec_())
return mainwindow
if __name__=="__main__":
w = main(sys.argv)
我在通用的Windows7 Office PC上使用32位Python 2.7.6和PySide 1.2.2。
感谢您的帮助!