Удалить / Удалить Легенду в PyQtGraph - PullRequest
2 голосов
/ 22 марта 2020

На прямом графике создаются две линии и добавляется легенда. При следующем обновлении линии на диаграмме удаляются с помощью self.pw.clear ().

Но легенда не удаляется, и при каждом обновлении добавляется новый экземпляр легенды. их много, и FPS обновления расписания быстро падает.

Здесь http://www.pyqtgraph.org/documentation/graphicsItems/plotitem.html говорит Clear (): «Удалить все элементы из ViewBox».

Попытка удалить / удалитьItem - еще не помогла (либо синтаксис неверен, либо вызов процедуры неверен).

Как удалить легенду при обновлении диаграммы или остановить создание нескольких легенд?

import random
from PyQt5 import QtGui
import pyqtgraph as pg
import sys

class Mainwindow(QtGui.QMainWindow):
    def __init__(self, parent):
        super(Mainwindow, self).__init__()
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.resize(1000, 500)

        self.vbox = QtGui.QVBoxLayout()
        self.pw = pg.PlotWidget()
        self.vbox.addWidget(self.pw)
        self.centralWidget.setLayout(self.vbox)

        # Update chart
        self.timer = pg.QtCore.QTimer()
        self.timer.setSingleShot(False)
        self.timer.timeout.connect(self.update)
        self.timer.start(10)

    def update(self):
        x = []
        y = []
        z = []
        for i in range(10000):
            x.append(i)
            y.append(random.uniform(0, 1))
            z.append(1 + random.uniform(0, 1))

        self.pw.clear()
        line_red = pg.PlotCurveItem(x, y, clear=True, pen='r', name='Red')
        line_yellow = pg.PlotCurveItem(x, z, clear=True, pen='y', name='Yellow')
        self.pw.addItem(line_red)
        self.pw.addItem(line_yellow)
        self.pw.addLegend()

app = QtGui.QApplication(sys.argv)
ex = Mainwindow(app)
ex.show()
sys.exit(app.exec_())

1 Ответ

2 голосов
/ 22 марта 2020

У вас проблема XY , вместо того, чтобы спрашивать, как обновить сюжет? вопросы Как устранить дублирующую легенду? Поэтому я укажу решение основной проблемы.

Учитывая вышеизложенное, логика c заключается в создании элементов только один раз и обновлении информации с использованием метода setData().

import random
import sys

import pyqtgraph as pg
from pyqtgraph.Qt import QtGui


class Mainwindow(QtGui.QMainWindow):
    def __init__(self, parent):
        super(Mainwindow, self).__init__()
        self.centralWidget = QtGui.QWidget()
        self.setCentralWidget(self.centralWidget)
        self.resize(1000, 500)

        vbox = QtGui.QVBoxLayout(self.centralWidget)
        self.pw = pg.PlotWidget()
        self.pw.addLegend()
        vbox.addWidget(self.pw)

        # Update chart
        self.timer = pg.QtCore.QTimer()
        self.timer.setSingleShot(False)
        self.timer.timeout.connect(self.update)
        self.timer.start(10)

        self.line_red = pg.PlotCurveItem(clear=True, pen="r", name="Red")
        self.line_yellow = pg.PlotCurveItem(clear=True, pen="y", name="Yellow")

        self.pw.addItem(self.line_red)
        self.pw.addItem(self.line_yellow)

    def update(self):
        x = []
        y = []
        z = []
        for i in range(10000):
            x.append(i)
            y.append(random.uniform(0, 1))
            z.append(1 + random.uniform(0, 1))
        self.line_red.setData(x, y)
        self.line_yellow.setData(x, z)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = Mainwindow(app)
    ex.show()
    sys.exit(app.exec_())
...