Animação Matplotlib dentro de sua própria GUI PyQt4
Estou escrevendo software em Python. Preciso incorporar uma animação por tempo do Matplotlib em uma GUI criada por você. Aqui estão mais alguns detalhes sobre eles:
1. A GUIA GUI também é escrita em Python, usando a biblioteca PyQt4. Minha GUI não é muito diferente das GUIs comuns que você pode encontrar na rede. Eu apenas subclasseQtGui.QMainWindow e adicione alguns botões, um layout, ...
2. A animaçãoA animação Matplotlib é baseada noanimation.TimedAnimation classe. Aqui está o código para a animação:
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()
Este código produz uma animação simples:
A animação em si funciona bem. Execute o código, a animação aparece em uma pequena janela e começa a executar. Mas como incorporar a animação em minha própria GUI criada por você?
3. Incorporando a animação em uma GUI criada por vocêEu fiz algumas pesquisas para descobrir. Aqui estão algumas coisas que eu tentei. Eu adicionei o seguinte código ao arquivo python. Observe que esse código adicionado é realmente uma definição de classe extra:
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)
O que tento fazer aqui é incorporar oCustomGraph () objeto - que é essencialmente minha animação - em umFigureCanvas.
Eu escrevi minha GUI em outro arquivo python (mas ainda na mesma pasta). Normalmente, posso adicionar widgets à minha GUI. Eu acredito que um objeto da classeCustomFigCanvas (..) é um widget por herança. Então é isso que eu tento na minha GUI:
..
myFigCanvas = CustomFigCanvas()
self.myLayout.addWidget(myFigCanvas)
..
Funciona até certo ponto. Recebo de fato uma figura exibida na minha GUI. Mas a figura está vazia. A animação não é executada:
E ainda há outro fenômeno estranho acontecendo. Minha GUI exibe essa figura vazia, mas recebo simultaneamente uma janela pop-up normal do Matplotlib com minha figura de animação. Além disso, esta animação não está sendo executada.
Há claramente algo que estou perdendo aqui. Por favor, ajude-me a descobrir esse problema. Agradeço muito toda a ajuda.