我已经尝试了几个小时来让这个简单的脚本正常工作,但我所做的一切似乎都无济于事。这是对 Matplotlib 网站上最基本的动画绘图示例代码的轻微修改,应该只显示几帧噪声(顺便说一句,我对他们网站上未修改的代码也有同样的问题)。
在我使用 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)
这个更简单的版本也会在前几帧后卡住:
from pylab import *
ion()
hold(False)
for i in range(40):
plot(randn(10))
draw()
show()
谢谢!
编辑:这些人似乎遇到了与我相同或相似的问题:
- 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
看起来他们中的任何一个都无法修复它:(
最佳答案
通常,GUI 框架需要“拥有”程序的主循环。坐在紧密的 sleep 循环中以延迟迭代通常会“破坏”GUI 应用程序(您的问题描述与这些方面的典型破坏一致)。 matplotlib 开发人员可能已经实现了一些幕后逻辑来防止某些工具包发生这些锁定,但稍微重构您的程序应该可以消除任何主循环所有权成为问题的可能性(这很可能我思考)。 matplotlib animation wiki还建议对任何重要的事情使用 native 事件循环(可能是因为这个原因)
我建议您使用 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
查看 matplotlib 文档表明可以在本地使用它们的 API,但我无法通过快速搜索找到任何好的示例。
关于python - Matplotlib 动画要么在几帧后卡住,要么就是不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3441874/