Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matplotlib动画在wxpython gui中不更新,但独立工作_Python_Animation_Matplotlib_Wxpython - Fatal编程技术网

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

matplotlib动画在wxpython gui中不更新,但独立工作,python,animation,matplotlib,wxpython,Python,Animation,Matplotlib,Wxpython,我有一个wxpythongui,其中我使用matplotlib进行二维和三维图形 我在获取曲面图以设置动画时遇到了问题,因此我使用了以下从在线某处改编的虚拟案例进行测试。这是一个典型的3D动画示例,单独运行时效果良好 if True: from mpl_toolkits.mplot3d import axes3d import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as an

我有一个wxpythongui,其中我使用matplotlib进行二维和三维图形

我在获取曲面图以设置动画时遇到了问题,因此我使用了以下从在线某处改编的虚拟案例进行测试。这是一个典型的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.按钮将完全相同的代码插入到GUI中,导致代码执行时,它只打印第一帧,而不打印其他帧,但也不会发出任何错误(在空闲状态下运行)。我可以通过打印来验证是否正在打印一个(第一次迭代
I=0
)帧

这正是引起问题的实际感兴趣数据的行为


谢谢。

在GUI类中使用动画时,请确保在类成员中保留对动画对象的引用,以便在创建动画对象的方法结束时不会对其进行垃圾收集。使用类似

self.ani = animation.FuncAnimation(....
而不是

ani = animation.FuncAnimation(....

应该可以工作。

您是否在GUI中保留对ani的引用?如果将此代码放入方法中,如果未将引用放入成员变量或类似的内容中,则该引用将被垃圾收集。@Ajean这就是票证。我只是简单地将ani改为self.ani,它就可以工作了。谢谢但是,你知道为什么这会发生在某些动画而不是其他动画中吗?当我使用
ArtistAnimation
时,在GUI中相同位置的图像列表中使用相同的数据,而不使用self.ani时,它可以工作。(绘制一个改变的图像)我不确定。。。我认为它们都继承自
TimedAnimation
,但就本质而言,我怀疑您必须深入研究代码本身。此外,由于它解决了问题,因此将该评论作为答案发布。