【问题标题】:Python - how do you embed matplotlib animation in a Qwidget created in Qt designer?Python - 如何将 matplotlib 动画嵌入在 Qt 设计器中创建的 Qwidget 中?
【发布时间】:2020-04-05 12:02:56
【问题描述】:

从将 matplotlib 嵌入 Qwidget 开始,我遵循了以下教程: https://yapayzekalabs.blogspot.com/2018/11/pyqt5-gui-qt-designer-matplotlib.html

文件可以在这里下载: https://drive.google.com/drive/folders/10V1Nh1xAVAfwydBtsJvoVGaYiR_HI15X?usp=sharing

本教程包含一个 mplwidget.py 文件:

from PyQt5.QtWidgets import *
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure


class MplWidget(QWidget):

def __init__(self, parent=None):
    QWidget.__init__(self, parent)

    self.canvas = FigureCanvas(Figure())

    vertical_layout = QVBoxLayout()
    vertical_layout.addWidget(self.canvas)

    self.canvas.axes = self.canvas.figure.add_subplot(111)
    self.setLayout(vertical_layout)

main.py:

from PyQt5.QtWidgets import*
from PyQt5.uic import loadUi
from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as NavigationToolbar)
import numpy as np
import random

class MatplotlibWidget(QMainWindow):

    def __init__(self):

        QMainWindow.__init__(self)

        loadUi("qt_designer.ui",self)

        self.setWindowTitle("PyQt5 & Matplotlib Example GUI")

        self.pushButton_generate_random_signal.clicked.connect(self.update_graph)

        self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))


    def update_graph(self):

        fs = 500
        f = random.randint(1, 100)
        ts = 1/fs
        length_of_signal = 100
        t = np.linspace(0,1,length_of_signal)

        cosinus_signal = np.cos(2*np.pi*f*t)
        sinus_signal = np.sin(2*np.pi*f*t)

        self.MplWidget.canvas.axes.clear()
        self.MplWidget.canvas.axes.plot(t, cosinus_signal)
        self.MplWidget.canvas.axes.plot(t, sinus_signal)
        self.MplWidget.canvas.axes.legend(('cosinus', 'sinus'),loc='upper right')
        self.MplWidget.canvas.axes.set_title('Cosinus - Sinus Signal')
        self.MplWidget.canvas.draw()


app = QApplication([])
window = MatplotlibWidget()
window.show()
app.exec_()

还有 qt_designer.ui 文件,它有一个按钮和一个 Qwidget(在 QT Designer 中升级为 MplWidget)。

这对于静态 matplotlib 图形非常有用,但似乎无法制作动画。我想我不明白在这种情况下被视为figure。我需要寄什么给

FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)[source]

将图形显示为动画,假设 10 个随机图形一个接一个地显示?

我试过把代码改成这样:

#In the init function
self.pushButton_generate_random_signal.clicked.connect(self.update_animation)

def update_animation(self):
    self.ani = animation.FuncAnimation(self.MplWidget.canvas, self.update_graph, interval=1000)
    self.MplWidget.canvas.draw()

def update_graph(self):
    for k in range(1, 10):
        fs = 500
        f = random.randint(1, 100)
        ts = 1/fs
        length_of_signal = 100
        t = np.linspace(0,1,length_of_signal)

        cosinus_signal = np.cos(2*np.pi*f*t)
        sinus_signal = np.sin(2*np.pi*f*t)

        self.MplWidget.canvas.axes.clear()
        self.MplWidget.canvas.axes.plot(t, cosinus_signal)
        self.MplWidget.canvas.axes.plot(t, sinus_signal)

但这完全破坏了python。大多数示例研究使用 matplotlib.pyplot 作为带有fig = plt.plot 的 plt。所以我想我不明白如何将MplWidget 设置为情节。任何帮助将不胜感激。谢谢

【问题讨论】:

  • 把ani改成self.ani
  • 感谢您的提示。有意义的是它应该是自我并编辑了帖子,但它仍然不起作用。
  • 感谢 eyllanesc。让它工作并发布答案,尽管它似乎在完成 10 个循环后重新启动动画。

标签: python matplotlib animation qt-designer


【解决方案1】:

感谢 cmets 中的 eyllanesc,我意识到 ani 应该是 self.ani,从那里我不得不将 self.MplWidget.canvas 更改为 self.MplWidget。我还更新了结构并添加了“repeat = False”语句以在 10 次循环后停止动画。以下 main.py 有效:

from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi

from matplotlib.backends.backend_qt5agg import (NavigationToolbar2QT as 
NavigationToolbar)
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
import random

class MatplotlibWidget(QMainWindow):

    def __init__(self): # Create matplotlib interface
        super(MatplotlibWidget, self).__init__()
        loadUi("qt_designer.ui", self)
        self.setWindowTitle("PyQt5 & Matplotlib Example GUI")
        self.addToolBar(NavigationToolbar(self.MplWidget.canvas, self))
        self.pushButton_generate_random_signal.clicked.connect(self.update_animation)

    def update_animation(self):
        self.ani = animation.FuncAnimation(self.MplWidget, self.update_axes, 
        self.update_graph, interval=1000, repeat=False)
        self.MplWidget.canvas.draw()

    def update_graph(self):
        for k in range(1, 10):
            fs = 500
            f = random.randint(1, 100)
            ts = 1 / fs
            length_of_signal = 100
            t = np.linspace(0, 1, length_of_signal)

            cosinus_signal = np.cos(2 * np.pi * f * t)
            sinus_signal = np.sin(2 * np.pi * f * t)
            yield t, cosinus_signal, sinus_signal


    def update_axes(self, update):
        t, cosinus_signal, sinus_signal = update[0], update[1], update[2]
        self.MplWidget.canvas.axes.clear()
        self.MplWidget.canvas.axes.plot(t, cosinus_signal)
        self.MplWidget.canvas.axes.plot(t, sinus_signal)


app = QApplication([])
window = MatplotlibWidget()
window.show()
app.exec_()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多