ScaleBar в pyqtgraph не обновляется при изменении масштаба - PullRequest
0 голосов
/ 22 января 2019

Когда я изменяю масштаб оси моего изображения, мой ScaleBar показывает неправильный масштаб.Как обновить масштабную линейку при смене осей?

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

    imvOCTTopLeft.view.getAxis('left').setScale(0.6)
    imvOCTTopLeft.view.getAxis('bottom').setScale(0.4)

    scale = pg.ScaleBar(size=10,suffix = "px")
    viewbox = imvOCTTopLeft.view
    if not isinstance(viewbox, pg.ViewBox): viewbox = viewbox.getViewBox()
    scale.setParentItem(viewbox)
    scale.anchor((1, 1), (1, 1), offset=(-20, -20))
    imvOCTTopLeft.show()

    sys.exit(app.exec_())

Это изображение показывает, что масштабная линейка показывает приблизительно 4 пикселя, но утверждает, что показывает 10 пикселов.

Я думаю, это потому, что я изменил масштаб оси.

1 Ответ

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

Кажется, это ошибка: ссылка . Окно просмотра масштабируется после выброса sigRangeChanged.

«Хакерское» решение - отложить обновление ScaleBar: (Возможно, вам придется поиграться с time, 100 и 10, сработавшими для меня. Если это не сработает, увеличьте его.)

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


def updateDelay(scale, time):
    QtCore.QTimer.singleShot(time, scale.updateBar)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)

    plotItem = pg.PlotItem()
    imvOCTTopLeft = pg.ImageView(view=plotItem)
    imvOCTTopLeft.setImage(np.random.normal(size=(100, 100)))

    imvOCTTopLeft.view.getAxis('left').setScale(0.6)
    scale = 0.4 #edit
    imvOCTTopLeft.view.getAxis('bottom').setScale(scale) #edit

    scale = pg.ScaleBar(size=10*(1/scale), suffix="px") #edit
    scale.text.setText('10 px') #edit
    plotItem.sigRangeChanged.connect(lambda: updateDelay(scale, 10))  # here: time=10ms
    viewbox = imvOCTTopLeft.view
    if not isinstance(viewbox, pg.ViewBox): viewbox = viewbox.getViewBox()
    scale.setParentItem(viewbox)
    scale.anchor((1, 1), (1, 1), offset=(-20, -20))
    imvOCTTopLeft.show()
    updateDelay(scale, 100)  # here time=100ms

    sys.exit(app.exec_())

Результат: result

...