Как я могу получить мой график для динамического обновления? - PullRequest
0 голосов
/ 29 июня 2019

Мой пользовательский файл содержит контейнер виджетов с вертикальной компоновкой с именем «VL» и редактируемой строкой с именем «Radiance».Я создал одну гистограмму, которую я хочу изменить при вводе значений в строку редактирования.На данный момент он делает именно это, за исключением того, что каждый раз создает новый сюжет.Если я использую свою функцию «удалить», она не создает отдельный отдельный график, но разрушает его макет.Я думаю, что проблема связана с моей функцией «удалить» и где ее поставить, пожалуйста, помогите.

Я импортировал QtWidgets, uic, matplot.figure и необходимые бэкэнды:

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        uic.loadUi('PyQt_App1.ui', self)
        self.setWindowTitle("Window Title")
        self.Radiance.textChanged.connect(self.animate)

    def animate(self):
        self.remove()
        r = self.Radiance.text()
        if r:
            rad = float(r)
            positions = [0.25]
            fig1 = Figure()
            ax1f1 = fig1.add_subplot(111)
            ax1f1.set_ylim([0, 100])
            ax1f1.set_xlim([0, 0.5])
            ax1f1.bar(positions, rad, width=0.2, color="g")
            self.addmpl(fig1)

        else:
            r = 0
            rad = float(r)
            positions = [0.25]
            fig1 = Figure()
            ax1f1 = fig1.add_subplot(111)
            ax1f1.set_ylim([0, 100])
            ax1f1.set_xlim([0, 0.5])
            ax1f1.bar(positions, rad, width=0.2, color="g")
            self.addmpl(fig1)

    def addmpl(self, fig):
        self.canvas = FigureCanvas(fig)
        self.VL.addWidget(self.canvas)
        # self.canvas.setParent(self.Frame)
        self.canvas.draw()

    def remove(self):
        self.VL.removeWidget(self.canvas)
        self.canvas.close()


if __name__ == '__main__':
    import sys
    from PyQt5 import QtWidgets

    app = QtWidgets.QApplication(sys.argv)
    main = MyWindow()
    main.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 29 июня 2019

Вместо того, чтобы создавать новую фигуру каждый раз, я просто сохранял бы ссылки на текущий линейчатый график и текущие оси и использовал их для обновления фигуры, например,

from PyQt5 import QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.pyplot import Figure

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        central = QtWidgets.QWidget(self)
        self.VL = QtWidgets.QVBoxLayout(central)
        self.Radiance = QtWidgets.QLineEdit(self)
        self.VL.addWidget(self.Radiance)
        self.canvas = FigureCanvas(Figure())
        self.VL.addWidget(self.canvas)

        self.ax1f1 = self.canvas.figure.subplots()
        self.ax1f1.set_ylim([0, 100])
        self.ax1f1.set_xlim([0, 0.5])
        self.bar = None

        self.setWindowTitle("Window Title")
        self.setCentralWidget(central)
        self.Radiance.textChanged.connect(self.animate)

    def animate(self):
        r = self.Radiance.text()
        try:
            rad = float(r)
        except ValueError:
            rad = 0
        positions = [0.25]
        if self.bar:
            self.bar.remove()
        self.bar = self.ax1f1.bar(positions, rad, width=0.2, color="g")
        self.canvas.draw()

if __name__ == '__main__':
    import sys
    from PyQt5 import QtWidgets

    app = QtWidgets.QApplication(sys.argv)
    main = MyWindow()
    main.show()
    sys.exit(app.exec_())
...