【问题标题】:make a button for animation in matplotlib在 matplotlib 中制作动画按钮
【发布时间】:2016-10-01 17:07:02
【问题描述】:

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

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

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

我怎样才能让它工作? 谢谢!

【问题讨论】:

    标签: python qt animation button matplotlib


    【解决方案1】:

    尽量提供最少的工作示例。如果没有 anomacion.ui,我们将无法运行您的代码。

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

    【讨论】:

      【解决方案2】:

      我解决了用动画制作函数的问题

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2016-11-02
        • 2013-06-17
        • 1970-01-01
        相关资源
        最近更新 更多