Перемещение ВСЕХ ТОЧЕК в pyqtgraph

https://ru.stackoverflow.com/questions/1317315/Перемещение-точек-графика-pyqtgraph Я прикреплю старую тему. Да, очень помог S. Nick.

Но ! Проблема заключается в определении точек. Они всегда возвращают одну и ту же.

Точка посередине

Допустим я хочу переместить ту точку, которая посередине.
Ок.
Перемещаю, вывожу какая она (должна быть 1).

Точка перемещённая

Да. Это действительно первая (вторая сверху точка)
Верно.
График приведу.

Перемещённая точка в середине

Но! Когда я пытаюсь переместить самую первую точку в координате (1, 1) , она выводит:

введите сюда описание изображения

Почему значение точки по прежнему 1, хотя должно быть 0? Как быть? Ведь метод isFinish() должен обнулить её. Почему этого не происходит?

import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui

pg.setConfigOptions(antialias=True)

w = pg.PlotWidget()
w.setWindowTitle('Draggable')


class Graph(pg.GraphItem):
    def __init__(self):
        self.dragPoint = None
        self.dragOffset = None
        pg.GraphItem.__init__(self)

    def setData(self, **kwds):
        self.data = kwds
        if 'pos' in self.data:
            npts = self.data['pos'].shape[0]
            self.data['adj'] = np.column_stack(
                (np.arange(0, npts-1), np.arange(1, npts))
            )
            self.data['data'] = np.empty(npts, dtype=[('index', int)])
            self.data['data']['index'] = np.arange(npts)
        self.updateGraph()

    def updateGraph(self):
        pg.GraphItem.setData(self, **self.data)

    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return
        if ev.isStart():
            pos = ev.buttonDownPos()
            pts = self.scatter.pointsAt(pos)
            if len(pts) == 0:
                ev.ignore()
                return
                
            self.dragPoint = pts[0]
            ind = pts[0].data()[0]
            self.dragOffset = self.data['pos'][ind][1] - pos[1]
        elif ev.isFinish():
            self.dragPoint = None
            return
        else:
            if self.dragPoint is None:
                ev.ignore()
                return

        ind = self.dragPoint.data()[0]
        self.data['pos'][ind][1] = ev.pos()[1] + self.dragOffset
        self.data['pos'][ind][0] = ev.pos()[0] + self.dragOffset
        self.updateGraph()
        print(ev.pos(),self.dragPoint.data()[0])
        ev.accept()


g = Graph()
v = w.addPlot()
v.addItem(g)

#                      v <---- попробуйте изменить значение
x = np.linspace(1, 10, 3)

pos = np.column_stack((x, np.sin(x)))
g.setData(pos=pos, size=10, pxMode=True)

if __name__ == '__main__':
    import sys

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

import sys
import numpy as np
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui


app = pg.mkQApp()                                               # +++
 
pg.setConfigOptions(antialias=True)


class Graph(pg.GraphItem):
    def __init__(self):
        self.dragPoint = None
        self.dragOffset = None
        pg.GraphItem.__init__(self)   

    def setData(self, **kwds):
        self.data = kwds
        if 'pos' in self.data:
            npts = self.data['pos'].shape[0]
            self.data['adj'] = np.column_stack(
                (np.arange(0, npts-1), np.arange(1, npts))
            )
            self.data['data'] = np.empty(npts, dtype=[('index', int)])
            self.data['data']['index'] = np.arange(npts)
        self.updateGraph()

    def updateGraph(self):
        pg.GraphItem.setData(self, **self.data)

    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return
        if ev.isStart():
            pos = ev.buttonDownPos()
            pts = self.scatter.pointsAt(pos)
            if len(pts) == 0:
                ev.ignore()
                return
                
            self.dragPoint = pts[0]
            ind = pts[0].data()[0]
            self.dragOffset = self.data['pos'][ind][1] - pos[1]
        elif ev.isFinish():
            self.dragPoint = None
            return
        else:
            if self.dragPoint is None:
                ev.ignore()
                return

        ind = self.dragPoint.data()[0]
        self.data['pos'][ind][1] = ev.pos()[1] + self.dragOffset
        self.data['pos'][ind][0] = ev.pos()[0] + self.dragOffset
        self.updateGraph()
        print(ev.pos(),self.dragPoint.data()[0])
        ev.accept()

g = Graph()

pw = pg.PlotWidget(title="PlotItem")                            # +++
pw.addItem(g)                                                   # +++
pw.show()                                                       # +++

#                      v <---- попробуйте изменить значение
x = np.linspace(1, 10, 3)

pos = np.column_stack((x, np.sin(x)))
g.setData(pos=pos, size=10, pxMode=True)

if __name__ == '__main__':
    import sys

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()
        

введите сюда описание изображения

→ Ссылка