Pyqtgraph ImageView не обновляется после изменения значения QSlider - PullRequest
0 голосов
/ 06 апреля 2020

Я работаю над пользовательским интерфейсом PyQt5 + pyqtgraph. Основная идея заключается в том, чтобы иметь средство просмотра изображений, которое я могу обновлять, используя виджеты из главного окна, такие как ползунки, редактирование строк, кнопки ... Теперь у меня возникают проблемы с обновлением изображения при перемещении слайсера. Он подключается к ожидаемым функциям, но изображение в ImageViewer всегда остается прежним (первое). Как я могу решить это? Я знаю, что pyqtgraph ImageViewer может работать с трехмерными массивами, но в будущем мне придется добавить более одного средства просмотра, которое будет обновляться одним и тем же ползунком. Вот код, который у меня есть:

Этот файл HDF5, который я использую, представляет собой массив размером (2048, 2048, 10) (10 изображений в формате uint16).

from PyQt5 import QtGui, QtWidgets, uic
import pyqtgraph as pg
import numpy as np
import os, sys, h5py

class ZoomGUI:
    def __init__(self, parent=None):
        self.ui = uic.loadUi(os.path.dirname(os.path.realpath(__file__)) + '/GUI/ZoomGUI.ui')

        self.file_path = "recon/tomo-2048x2048x10_16bit.h5"

        #Configure slices slicer
        self.number_of_slices = self.get_number_of_slices()
        self.ui.slicesSlider.setMaximum(self.number_of_slices-1)
        self.ui.slicesSlider.valueChanged.connect(self.imageView)
        self.updateImage()

        #Add image widget
        self.ui.ImageWidget.setLayout(QtGui.QVBoxLayout())
        self.ui.ImageWidget.layout().addWidget(self.imv)


    def imageView(self,slice_number):
        self.imv = pg.ImageView()
        self.imagedata = self.get_image(slice_number)
        print(self.imagedata)
        self.imv.setImage(self.imagedata)

    def updateImage(self):
        actual_slice = int(self.ui.slicesSlider.value())
        self.imageView(actual_slice)

    #File related functions
    def get_image(self, slice_number):
        h5 = h5py.File(self.file_path, "r")
        data = h5["slices"][slice_number]
        h5.close()
        return(data)

    def get_number_of_slices(self):
        h5 = h5py.File(self.file_path, "r")
        size = len(h5["slices"])
        h5.close()
        return(size)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)      
    ZoomGUI = ZoomGUI()               
    ZoomGUI.ui.show()                  
    app.exec_()

Это файл .ui. Он имеет только слайдер и виджет QWidget.

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1132</width>
    <height>880</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout_2">
    <item row="0" column="0">
     <layout class="QGridLayout" name="gridLayout">
      <item row="0" column="0">
       <layout class="QGridLayout" name="ImageWidgetLayout">
        <item row="0" column="0">
         <widget class="QWidget" name="ImageWidget" native="true"/>
        </item>
       </layout>
      </item>
      <item row="2" column="0">
       <widget class="QPushButton" name="pushButton">
        <property name="text">
         <string>PushButton</string>
        </property>
       </widget>
      </item>
      <item row="1" column="0">
       <widget class="QSlider" name="slicesSlider">
        <property name="orientation">
         <enum>Qt::Horizontal</enum>
        </property>
       </widget>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1132</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

1 Ответ

1 голос
/ 06 апреля 2020

Вы создаете новый ImageView, который не был добавлен в окно, поэтому вы не видите изменения, решение состоит в том, чтобы создать ImageView только один раз, а затем повторно использовать его

class ZoomGUI:
    def __init__(self, parent=None):
        self.ui = uic.loadUi(
            os.path.dirname(os.path.realpath(__file__)) + "/GUI/ZoomGUI.ui"
        )

        self.file_path = "recon/tomo-2048x2048x10_16bit.h5"

        # Add image widget
        lay = QtGui.QVBoxLayout(self.ui.ImageWidget)
        self.imv = pg.ImageView()
        lay.addWidget(self.imv)

        # Configure slices slicer
        self.number_of_slices = self.get_number_of_slices()
        self.ui.slicesSlider.setMaximum(self.number_of_slices - 1)
        self.ui.slicesSlider.valueChanged.connect(self.imageView)

        self.imageView(self.ui.slicesSlider.value())

    def imageView(self, slice_number):

        imagedata = self.get_image(slice_number)
        print(imagedata)
        self.imv.setImage(imagedata)

    def get_image(self, slice_number):
        h5 = h5py.File(self.file_path, "r")
        data = h5["slices"][slice_number]
        h5.close()
        return data

    def get_number_of_slices(self):
        h5 = h5py.File(self.file_path, "r")
        size = len(h5["slices"])
        h5.close()
        return size
...