Анимация Matplotlib внутри вашего собственного PyQt4 GUI
Я пишу программное обеспечение на Python. Мне нужно встроить анимацию времени Matplotlib в самодельный графический интерфейс. Вот еще несколько подробностей о них:
1. GUIGUI также написан на 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 с моей анимационной фигурой в нем. Также эта анимация не работает.
Здесь явно есть что-то, чего мне не хватает. Пожалуйста, помогите мне разобраться с этой проблемой. Я очень ценю всю помощь.