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)
谢谢!
编辑:这些人似乎和我有相同或类似的问题:
看起来他们中的任何一个都不能解决它:(
通常,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,但仅通过快速搜索就找不到任何好的示例。
当您说在前几帧后冻结时,您的意思是 2 或 3,或者说 40 或 60,因为这些是循环的上限?
如果您希望动画无限期地继续,您需要类似的东西
while True:
d = randn(10)
line.set_ydata(d)
draw()
time.sleep(10e-3)
Run Code Online (Sandbox Code Playgroud)
但你必须强制退出你的程序。