Matplotlib-Animation in Ihrer eigenen PyQt4-GUI

Ich schreibe Software in Python. Ich muss eine Matplotlib-Zeitanimation in eine selbst erstellte GUI einbetten. Hier einige Details dazu:

1. Die GUI

Die GUI wurde ebenfalls in Python unter Verwendung der PyQt4-Bibliothek geschrieben. Meine Benutzeroberfläche unterscheidet sich nicht sehr von den allgemeinen Benutzeroberflächen im Internet. Ich habe gerade die Unterklasse QtGui.QMainWindow und fügen Sie einige Schaltflächen, ein Layout, ...

2. Die Animatio

Die Matplotlib-Animation basiert auf dem animation.TimedAnimation Klasse. Hier ist der Code für die Animation:

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

Dieser Code erzeugt eine einfache Animation:

Die Animation selbst funktioniert gut. Führen Sie den Code aus, die Animation wird in einem kleinen Fenster angezeigt und gestartet. Aber wie binde ich die Animation in meine eigene GUI ein?

3. Einbetten der Animation in eine selbst erstellte GUI

ch habe einige Nachforschungen angestellt, um das herauszufinden. Hier sind einige Dinge, die ich ausprobiert habe. Ich habe der Python-Datei den folgenden Code hinzugefügt. Beachten Sie, dass dieser hinzugefügte Code tatsächlich eine zusätzliche Klassendefinition ist:

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)

Was ich versuche hier zu tun, ist die @ einbettCustomGraph () Objekt - das ist im Wesentlichen meine Animation - in ein FigureCanvas.

Ich habe meine GUI in einer anderen Python-Datei geschrieben (aber immer noch im selben Ordner). Normalerweise kann ich Widgets zu meiner GUI hinzufügen. Ich glaube, dass ein Objekt aus der KlasseCustomFigCanvas (..) ist ein Widget durch Vererbung. Das versuche ich in meiner GUI:

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

Es funktioniert bis zu einem gewissen Grad. Ich bekomme in der Tat eine Zahl in meiner GUI angezeigt. Aber die Figur ist leer. Die Animation läuft nicht:

Und da ist noch ein anderes merkwürdiges Phänomen. Meine GUI zeigt diese leere Figur an, aber ich erhalte gleichzeitig ein reguläres Matplotlib-Popup-Fenster mit meiner Animationsfigur. Auch diese Animation läuft nicht.

Es ist klar, dass ich hier etwas vermisse. Bitte helfen Sie mir, dieses Problem herauszufinden. Ich schätze jede Hilfe sehr.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage