2016-10-01 44 views
0

我刚刚做了一个简单的gui,使用Qt Designer,gui有4个按钮和一个小部件。小部件将显示动画,按钮用于暂停动画,恢复,清除画布和开始动画。我做了这个代码:在matplotlib中制作动画按钮

import sys 
from PyQt4 import QtGui, uic 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 


def start(): 

    def datos(t=0): 
     while True: 
      t += 0.1 
      yield t, np.cos(t) 

    def init(): 
     ax.set_ylim(-1, 1) 
     ax.set_xlim(0, 5) 

    def run(data): 
     t,y = data 
     xdata.append(t) 
     ydata.append(y) 
     line.set_data(xdata, ydata) 
     xmin,xmax =ax.get_xlim() 

     if t > xmax: 
      ax.set_xlim(xmin, 1.5*xmax) 
      ax.figure.canvas.draw() 



    ani = animation.FuncAnimation(fig, run, datos, blit=False, interval=50, 
           repeat=False, init_func=init)         


    def stop(): 
     ani.event_source.stop() 

    def borr(): 
     plt.clf() 
     canvas.draw()      

    def anim(): 
     ani.event_source.start() 

    window.resume.clicked.connect(anim) 
    window.pause.clicked.connect(stop) 
    window.clean.clicked.connect(borr)  
    return ani   

layout=QtGui.QVBoxLayout() 
fig=plt.figure() 
canvas=FigureCanvas(fig) 
layout.addWidget(canvas) 

ax = fig.add_subplot(111) 
line,=ax.plot([],[],lw=2) 
ax.grid() 
xdata, ydata = [], [] 


app = QtGui.QApplication(sys.argv) 
window = uic.loadUi("animacion.ui") 


window.start.clicked.connect(start) 

window.widget.setLayout(layout) 


window.show() 
sys.exit(app.exec_()) 

这显示了网格,但是当我按下启动按钮,它不显示动画

我也做了这样的代码:

import sys 
from PyQt4 import QtCore, QtGui, uic 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 



def datos(t=0): 
    while True: 
     t += 0.1 
     yield t, np.cos(t) 

def init(): 
    ax.set_ylim(-1, 1) 
    ax.set_xlim(0, 5) 

def run(data): 
    t,y = data 
    xdata.append(t) 
    ydata.append(y) 
    line.set_data(xdata, ydata) 
    xmin,xmax =ax.get_xlim() 

    if t > xmax: 
     ax.set_xlim(xmin, 1.5*xmax) 
     ax.figure.canvas.draw() 
def start(): 
    window.widget.setLayout(layout)         

def stop(): 
    ani.event_source.stop() 

def borr(): 
    plt.clf() 
    canvas.draw()      

def anim(): 
    ani.event_source.start() 

layout=QtGui.QVBoxLayout() 
fig=plt.figure('test') 
canvas=FigureCanvas(fig) 
layout.addWidget(canvas) 

ax = fig.add_subplot(111) 
line,=ax.plot([],[],lw=2) 
ax.grid() 
xdata, ydata = [], [] 






app = QtGui.QApplication(sys.argv) 
window = uic.loadUi("animacion.ui") 

window.resume.clicked.connect(anim) 
window.pause.clicked.connect(stop) 
window.clean.clicked.connect(borr) 
window.start.clicked.connect(start) 



ani = animation.FuncAnimation(fig, run, datos, blit=False, interval=50, 
           repeat=False, init_func=init) 
window.show() 
sys.exit(app.exec_()) 

在这种情况下,当我按下开始动画开始时,我可以暂停并恢复。但是,当清洁画布时,按下按钮即可启动,但不显示该功能。

我该如何让它工作? 谢谢!

回答

0

尽量提供最少的工作的例子。没有animacion.ui,我们不能运行你的代码。

参考第二个代码:这里的问题似乎是在borr()里面你清除了这个数字(plt.clf())。如果数字被清除,动画应该放在哪里?

0

我解决了制作功能与动画

import sys 
from PyQt4 import QtGui, uic 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 


def start(): 

    def datos(t=0): 
     while True: 
      t += 0.1 
      yield t, np.cos(t) 

    def init(): 
     ax.set_ylim(-1, 1) 
     ax.set_xlim(0, 5) 

    def run(data): 
     t,y = data 
     xdata.append(t) 
     ydata.append(y) 
     line.set_data(xdata, ydata) 
     xmin,xmax =ax.get_xlim() 

     if t > xmax: 
      ax.set_xlim(xmin, 1.5*xmax) 
      ax.figure.canvas.draw() 


    def stop(): 
     ani.event_source.stop() 


    def borr(): 
     plt.clf() 
     canvas.draw() 


    def anim(): 
     ani.event_source.start() 


    window.resume.clicked.connect(anim) 
    window.pause.clicked.connect(stop) 
    window.clean.clicked.connect(borr) 

    ax = fig.add_subplot(111) 
    line,=ax.plot([],[],lw=2) 
    ax.grid() 
    xdata, ydata = [], [] 

    ani = animation.FuncAnimation(fig, run, datos, blit=False, interval=50, 
           repeat=False, init_func=init) 
    canvas.draw()  


layout=QtGui.QVBoxLayout() 
fig=plt.figure() 
canvas=FigureCanvas(fig) 
layout.addWidget(canvas) 




app = QtGui.QApplication(sys.argv) 
window = uic.loadUi("animacion.ui") 


window.start.clicked.connect(start) 

window.widget.setLayout(layout) 


window.show() 
sys.exit(app.exec_()) 
问题