Обновление иконки QpushButton из массива numpy не работает - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь создать иконку из массива numpy, отображаемого с помощью matplotlib imshow.

Мне удалось получить цвета из matplotlib в массив массивов измерений (n * n * 4)

Затем я преобразую этот массив с пустыми значениями в Qimage, а затем в Qpixmap, чтобы обновить иконку Q-кнопки.

Однако значок кнопки не соответствует изображению, которое я создал. На самом деле это ничего не делает. Если вместо этого я использовал образ с жесткого диска, значок будет обновлен правильно.

Вот пример кода:

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

1 Ответ

3 голосов
/ 28 марта 2019

Вы должны скопировать массив 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)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...