matplotlib动画在wxpython gui中不会更新,但是独立工作

时间:2015-03-26 12:58:11

标签: python animation matplotlib wxpython

我有一个wxPython GUI,我在其中使用matplotlib进行2D和3D图形处理。

我在制作动画表面图时遇到了问题,所以我使用了以下虚拟案例改编自在线某地进行测试。这是一个相当典型的3D动画示例,并且在独立运行时工作正常。

if True:
  from mpl_toolkits.mplot3d import axes3d
  import numpy as np
  import matplotlib.pyplot as plt
  import matplotlib.animation as animation
  def generate(X, Y, phi):
    R = 1 - np.sqrt(X**2 + Y**2)
    return np.cos(2 * np.pi * X + phi) * R

  fig = plt.figure()
  ax = axes3d.Axes3D(fig)

  xs = np.linspace(-1, 1, 3)
  ys = np.linspace(-1, 1, 3)
  X, Y = np.meshgrid(xs, ys)
  Z = generate(X, Y, 0.0)
  wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2)
  ax.set_zlim(-1,1)

  def update(i, ax, fig):
    print i
    ax.cla()
    phi = i * 360 / 2 / np.pi / 100
    Z = generate(X, Y, phi)
    wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2)
    ax.set_zlim(-1,1)
    return wframe

  ani = animation.FuncAnimation(fig, update, 
      frames=xrange(100), 
      fargs=(ax, fig), interval=100)
plt.show()

" True"测试当然是不必要的,但意味着在执行时复制类似GUI中的结构(以检查任何范围问题)。

当我使用wx.Button将完全相同的代码插入到GUI中导致代码执行时,它只绘制第一帧而不是其他内容,但也不会发出任何错误(在IDLE中运行)。我可以通过打印验证只有一个(第一个迭代i=0)框架正在绘制。

这正是导致问题的实际感兴趣数据的行为。

谢谢。

1 个答案:

答案 0 :(得分:1)

在GUI类中使用动画时,请确保在类成员中保留对动画对象的引用,以便在创建它的方法的末尾不会收集垃圾。使用像

这样的东西
self.ani = animation.FuncAnimation(....

而不是

ani = animation.FuncAnimation(....

应该有用。