姬長信(Redy)

python – 您自己的GUI中的Matplotlib动画


我正在用Python编写软件.我需要将Matplotlib时间动画嵌入到自制的GUI中.以下是有关它们的更多详细信息:

?1. GUI

GUI也是用Python编写的,使用PyQt4库.我的GUI与您在网上可以找到的常见GUI没有太大区别.我只是继承QtGui.QMainWindow并添加一些按钮,布局,……

?2.动画

Matplotlib动画基于animation.TimedAnimation类.这是动画的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import matplotlib.animation as animation

        class CustomGraph(animation.TimedAnimation):

        def __init__(self):

            self.n = np.linspace(0, 1000, 1001)
            self.y = 1.5 + np.sin(self.n/20)
            #self.y = np.zeros(self.n.size)


            # The window
            self.fig = plt.figure()
            ax1 = self.fig.add_subplot(1, 2, 1)
            self.mngr = plt.get_current_fig_manager() 
            self.mngr.window.setGeometry(50,100,2000, 800)

            # ax1 settings
            ax1.set_xlabel('time')
            ax1.set_ylabel('raw data')
            self.line1 = Line2D([], [], color='blue')
            ax1.add_line(self.line1)
            ax1.set_xlim(0, 1000)
            ax1.set_ylim(0, 4)


            animation.TimedAnimation.__init__(self, self.fig, interval=20, blit=True)


        def _draw_frame(self, framedata):
            i = framedata
            print(i)


            self.line1.set_data(self.n[ 0 : i ], self.y[ 0 : i ])

            self._drawn_artists = [self.line1]

        def new_frame_seq(self):
            return iter(range(self.n.size))

        def _init_draw(self):
            lines = [self.line1]
            for l in lines:
                l.set_data([], [])

        def showMyAnimation(self):
            plt.show()


    ''' End Class '''


    if __name__== '__main__':
        print("Define myGraph")
        myGraph = CustomGraph()
        myGraph.showMyAnimation()

此代码生成一个简单的动画:

动画本身很好用.运行代码,动画在一个小窗口中弹出,然后开始运行.但是如何将动画嵌入到我自己的GUI中呢?

?3.将动画嵌入自制GUI中

我做了一些研究以找出答案.这是我尝试过的一些事情.我已将以下代码添加到python文件中.请注意,此添加的代码实际上是一个额外的类定义:

from PyQt4 import QtGui
from PyQt4 import QtCore
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas

class CustomFigCanvas(FigureCanvas):

    def __init__(self):

        self.myGraph = CustomGraph()
        FigureCanvas.__init__(self, self.myGraph.fig)

我在这里尝试做的是将CustomGraph()对象 – 本质上是我的动画 – 嵌入到FigureCanvas中.

我在另一个python文件中编写了我的GUI(但仍然在同一个文件夹中).通常我可以在我的GUI中添加小部件.我相信CustomFigCanvas(..)类中的对象是一个通过继承的Widget.这就是我在GUI中尝试的内容:

    ..
    myFigCanvas = CustomFigCanvas()
    self.myLayout.addWidget(myFigCanvas)
    ..

它在某种程度上起作用.我确实在我的GUI中显示了一个数字.但这个数字是空的.动画无法运行:

甚至还有另一种奇怪的现象.我的GUI显示这个空图,但我同时得到一个常规的Matplotlib弹出窗口,里面有我的动画人物.此动画也未运行.

显然我在这里缺少一些东西.请帮我弄清楚这个问题.我非常感谢所有的帮助.