2016-10-01 40 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_()) 
問題