Анимация Matplotlib внутри вашего собственного PyQt4 GUI

Я пишу программное обеспечение на Python. Мне нужно встроить анимацию времени Matplotlib в самодельный графический интерфейс. Вот еще несколько подробностей о них:

1. GUI

GUI также написан на Python с использованием библиотеки PyQt4. Мой графический интерфейс не сильно отличается от обычных графических интерфейсов, которые вы можете найти в сети. Я просто подкласс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()

Этот код производит простую анимацию:

Сама анимация работает отлично. Запустите код, анимация появится в небольшом окне, и он начнет работать. Но как мне встроить анимацию в свой собственный графический интерфейс?

3. Встраивание анимации в самодельный графический интерфейс

Я провел некоторое исследование, чтобы выяснить это. Вот несколько вещей, которые я попробовал. Я добавил следующий код в файл 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 (но все еще в той же папке). Обычно я могу добавить виджеты в мой графический интерфейс. Я считаю, что объект из классаCustomFigCanvas (..) это виджет через наследование Вот что я пытаюсь сделать в своем графическом интерфейсе:

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

Это работает в некоторой степени. Я действительно получаю фигуру, отображаемую в моем графическом интерфейсе. Но фигура пуста. Анимация не запускается:

И происходит еще одно странное явление. Мой графический интерфейс отображает эту пустую фигуру, но я одновременно получаю обычное всплывающее окно Matplotlib с моей анимационной фигурой в нем. Также эта анимация не работает.

Здесь явно есть что-то, чего мне не хватает. Пожалуйста, помогите мне разобраться с этой проблемой. Я очень ценю всю помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос