Matplotlib动画要么在几帧后冻结,要么就是不起作用

Rog*_*ger 6 python animation numpy pyqt matplotlib

我一直在努力让这个简单的脚本工作,但我所做的一切似乎都没有帮助.这是对Matplotlib网站上最基本的动画情节示例代码的略微修改,应该只显示几帧噪音(我的网站BTW的未经修改的代码也有同样的问题).

在我的带有TkAgg后端的计算机上,在绘图窗口冻结之前,我得到大约20帧(60个).使用Qt4Agg,我只得到一个冷冻的黑色窗口,并且根本没有绘制帧.我尝试过不同的NumPy,PyQt,Python和Matplotlib版本的多种组合,但总能得到相同的结果.

如果这对你有用或者看错了,请告诉我.我很确定这在过去确实有效,所以我认为这可能是Windows问题或与之相关的问题ion().

仅供参考我正在使用Windows 7(32位),我已经使用Python 2.6/2.7,MPL 1.0.0/0.9.9.8,PyQt 4.6/4.7,Numpy 1.4/1.5b进行了测试.

import matplotlib
matplotlib.use('TkAgg') # Qt4Agg gives an empty, black window
from pylab import *
import time

ion()
hold(False)

# create initial plot
z = zeros(10)
line, = plot(z)
ylim(-3, 3)

for i in range(60):
    print 'frame:', i

    d = randn(10)
    line.set_ydata(d)

    draw()
    time.sleep(10e-3)
Run Code Online (Sandbox Code Playgroud)

这个更简单的版本在前几帧之后也会冻结:

from pylab import *

ion()
hold(False)

for i in range(40):
    plot(randn(10))
    draw()

show()
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:这些人似乎和我有相同或类似的问题:

  • mail-archive.com/matplotlib-users@lists.sourceforge.net/msg10844.html
  • stackoverflow.com/questions/2604119/matplotlib-pyplot-pylab-not-updating-figure-while-isinteractive-using-ipython
  • mail-archive.com/matplotlib-users@lists.sourceforge.net/msg01283.html

看起来他们中的任何一个都不能解决它:(

Rak*_*kis 5

通常,GUI框架需要“拥有”程序的主循环。陷入睡眠并延迟迭代的紧密循环通常会“破坏” GUI应用程序(您的问题描述与这些方面的典型破坏相一致)。matplotlib开发人员可能已经实现了一些幕后逻辑,以防止某些工具箱发生这些锁定,但是稍微重组您的程序应该消除出现主循环所有权的任何可能性(我认为这很可能)。matplotlib 动画Wiki还建议对不重要的事情使用本机事件循环(可能是由于这个原因)

我建议您不要使用睡眠循环,而是建议使用GUI工具包在特定延迟后安排函数调用。

def update_function():
    # do frame calculation here

refresh_timer = QtCore.QTimer()
QtCore.QObject.connect( refresh_timer, QtCore.SIGNAL('timeout()'), update_function )
refresh_timer.start( 1.0 / 30 ) # have update_function called at 30Hz
Run Code Online (Sandbox Code Playgroud)

查看matplotlib文档表明,可以在本地使用其API,但仅通过快速搜索就找不到任何好的示例。

  • 它在过去的工作可能比其他任何事情都更加意外。所有常见的GUI工具包本质上都是异步的,尝试同步使用它们是一个明确的设计缺陷。异步使用它们仍然可以保持非常简单,但是看起来matplotlib开发人员并没有付出太多努力……可能是由于动画比静态图像生成要小得多。无论如何,祝您的应用程序好运:) (2认同)

Way*_*ner 1

当您说在前几帧后冻结时,您的意思是 2 或 3,或者说 40 或 60,因为这些是循环的上限?

如果您希望动画无限期地继续,您需要类似的东西

while True:
    d = randn(10)
    line.set_ydata(d)
    draw()
    time.sleep(10e-3)
Run Code Online (Sandbox Code Playgroud)

但你必须强制退出你的程序。