pyqtgraph 中的 ScaleBar 不会设置 ParentItem
ScaleBar in pyqtgraph won't setParentItem
我正在尝试在 pyqtgraph/PyQt5 的 ImageView 中设置比例尺,但是当我为比例尺设置 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_()
我建议您在 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)
导致该错误的原因是 setParentItem()
方法需要一个 ViewBox,因为它具有 sigRangeChanged 信号,如果存在某种类型的缩放,该信号允许更新 ScaleBar。然后你可以通过视图属性获取 ViewBox,但是如果你像你所做的那样使用视图在构造函数中传递参数(pg.ImageView(view = pg.PlotItem())
),那么你必须使用 getViewBox()
通过该对象获取视图框。
您的代码中的另一个错误是 QApplication 属于 PyQt5 的 QtWidgets 子模块。
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_())
我正在尝试在 pyqtgraph/PyQt5 的 ImageView 中设置比例尺,但是当我为比例尺设置 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_()
我建议您在 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)
导致该错误的原因是 setParentItem()
方法需要一个 ViewBox,因为它具有 sigRangeChanged 信号,如果存在某种类型的缩放,该信号允许更新 ScaleBar。然后你可以通过视图属性获取 ViewBox,但是如果你像你所做的那样使用视图在构造函数中传递参数(pg.ImageView(view = pg.PlotItem())
),那么你必须使用 getViewBox()
通过该对象获取视图框。
您的代码中的另一个错误是 QApplication 属于 PyQt5 的 QtWidgets 子模块。
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_())