ScaleBar в pyqtgraph не будет устанавливатьParentItem - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь установить масштабную линейку в ImageView в pyqtgraph / PyQt5, но когда я устанавливаюParentItem для масштабной линейки, он не принимает ImageView, ImageItem или ViewBox.Нет сообщения об ошибке, но вся программа падает.

from PyQt5 import QtGui
import pyqtgraph as pg
import numpy as np

app = QtGui.QApplication([])

imvOCTTopLeft = pg.ImageView(view=pg.PlotItem())
imvOCTTopLeft.setImage(np.random.normal(size=(100,100)))
scale = pg.ScaleBar(size=0.1)
im=imvOCTTopLeft.getImageItem()
scale.setParentItem(im)

imvOCTTopLeft.show()

app.exec_()

1 Ответ

0 голосов
/ 22 января 2019

Я рекомендую вам выполнить свой код в CMD или терминале, чтобы вы могли получить больше информации об ошибке, если вы это сделаете, вы получите следующее сообщение:

Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/pyqtgraph/graphicsItems/GraphicsObject.py", line 23, in itemChange
    self.parentChanged()
  File "/usr/lib/python3.7/site-packages/pyqtgraph/graphicsItems/ScaleBar.py", line 44, in parentChanged
    view.sigRangeChanged.connect(self.updateBar)
AttributeError: 'ImageItem' object has no attribute 'sigRangeChanged'
Aborted (core dumped)

И эта ошибка вызвана тем, что *Для метода 1004 * требуется ViewBox, поскольку он имеет сигнал sigRangeChanged, который позволяет обновлять ScaleBar, если есть какой-либо тип масштабирования.Затем вы можете получить ViewBox через атрибут view, но если вы передадите параметр в конструкторе, используя view, как вы это сделали (pg.ImageView(view = pg.PlotItem())), то вы должны получить viewbox через этот объект, используя getViewBox().

Другая ошибка в вашем коде состоит в том, что QApplication принадлежит подмодулю QtWidgets PyQt5.

from PyQt5 import QtWidgets
import pyqtgraph as pg
import numpy as np

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)

    imvOCTTopLeft = pg.ImageView(view=pg.PlotItem())
    imvOCTTopLeft.setImage(np.random.normal(size=(100,100)))
    scale = pg.ScaleBar(size=10)
    viewbox = imvOCTTopLeft.view
    if not isinstance(viewbox, pg.ViewBox): viewbox = viewbox.getViewBox()
    scale.setParentItem(viewbox)
    scale.anchor((1, 1), (1, 1), offset=(-200, -20))
    imvOCTTopLeft.show()

    sys.exit(app.exec_())
...