Python 从numpy数组更新QpushButton图标don';行不通

Python 从numpy数组更新QpushButton图标don';行不通,python,numpy,pyqt,pyqt5,Python,Numpy,Pyqt,Pyqt5,我正在尝试从使用matplotlib imshow显示的numpy数组中创建一个图标 我成功地将matplotlib中的颜色获取到维度的numpy数组中(n*n*4) 然后,我将这个numpy数组转换成一个Qimage,然后转换成一个Qpixmap,以便更新Qpushbutton的图标 但是,按钮的图标没有设置为我创建的图像。事实上,它没有任何作用。如果改用硬盘中的图像,图标会正确更新 下面是一个代码示例: from PyQt5.QtGui import * from PyQt5.QtWidge

我正在尝试从使用matplotlib imshow显示的numpy数组中创建一个图标

我成功地将matplotlib中的颜色获取到维度的numpy数组中(n*n*4)

然后,我将这个numpy数组转换成一个Qimage,然后转换成一个Qpixmap,以便更新Qpushbutton的图标

但是,按钮的图标没有设置为我创建的图像。事实上,它没有任何作用。如果改用硬盘中的图像,图标会正确更新

下面是一个代码示例:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import  *
from PyQt5.QtCore import *
import numpy as np
import sys
import matplotlib.pyplot as plt 

class StimEdit(QMainWindow):
    def __init__(self, parent=None):
        super(StimEdit, self).__init__()
        self.parent = parent

        self.centralWidget = QWidget()
        self.color = self.centralWidget.palette().color(QPalette.Background)
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX_param_scene = QHBoxLayout()

        self.B = QPushButton('')
        self.B.setFixedSize(100,100)
        self.B.clicked.connect(self.updateicon)
        self.mainHBOX_param_scene.addWidget(self.B)
        self.centralWidget.setLayout(self.mainHBOX_param_scene)


    def updateicon(self):
        CM = np.random.random((10,10))
        ax = plt.imshow(CM)
        colours = (ax.cmap(ax.norm( CM )) * 255).astype(np.uint8)
        ncols, nrows, ncolors = colours.shape
        # image = QImage(colours.tostring(),ncols, nrows, ncolors,QImage.Format_RGBA8888)
        image = QImage(colours[:,:,:3].tostring(),ncols, nrows, ncolors-1,QImage.Format_RGB888)
        rMyIcon = QPixmap(image)
        self.B.setIcon(QIcon(rMyIcon))
        self.B.setIconSize(QSize(100, 100))
        self.parent.processEvents()


def main():
    app = QApplication(sys.argv)
    ex = StimEdit(app)
    ex.show()
    sys.exit(app.exec_( ))


if __name__ == '__main__':
    main()

您必须复制numpy数组,并使用

def updateicon(self):
    size = QSize(100, 100)
    CM = np.random.random((10,10))
    ax = plt.imshow(CM)
    colours = (ax.cmap(ax.norm( CM )) * 255).astype(np.uint8)
    im = colours[:, :, :3].copy()
    image = QImage(im.data, im.shape[1], im.shape[0], im.strides[0], QImage.Format_RGB888)
    pixmap = QPixmap(image)
    self.B.setIcon(QIcon(pixmap.scaled(size)))
    self.B.setIconSize(size)

我想我不明白为什么我们需要制作一份矩阵的副本来让它工作。@ymmx如果你意识到你的矩阵的维数是4,那么在内存中没有矩阵,但是数据是链接的,例如一个2x2矩阵:[[a,b],[c,d]]在内存中可以是a,c,b,d,现在想象一个三维矩阵,虽然你想复制数据,但这与你想忽略的第四维是交织在一起的,但是当我做
colors[:,:,:3]
,因为我只取数组的一部分,我应该直接得到它的副本,对吗?也许np.array与list不同呢?@ymmx
颜色[:,:,:3]。数据
不会复制值,但会给我们提供内存位置好吧,看来我还有很多东西要学。谢谢你抽出时间。