【问题标题】:How do I get my graph to dynamically update?如何让我的图表动态更新?
【发布时间】:2019-06-29 16:42:40
【问题描述】:

我的 ui 文件包含一个带有名为“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_())

【问题讨论】:

    标签: python pyqt pyqt5 qt-designer


    【解决方案1】:

    我不会每次都创建一个新图形,而是保留对当前条形图和当前轴的引用,并使用它们来更新图形,例如

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

    【讨论】:

    • 感谢您的代码!感谢您的帮助!我会给你一个“这篇文章很有用”的投票,但我还没有足够的声誉(我是新人)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多