Перемещение ВСЕХ ТОЧЕК в 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_()




