2016-10-03 95 views
2

我想要做的是更新循环中的mayavi阴谋。我想要在我指定的时间更新剧情(与动画装饰器不同)。更新mayavi阴谋循环

所以的代码示例一块,我想获得运行是:

import time 
import numpy as np 
from mayavi import mlab 

V = np.random.randn(20, 20, 20) 
s = mlab.contour3d(V, contours=[0]) 

for i in range(5): 

    time.sleep(1) # Here I'll be computing a new V 

    V = np.random.randn(20, 20, 20) 

    # Update the plot with the new information 
    s.mlab_source.set(scalars=V) 

然而,这并不能显示数字。如果我在循环中包含mlab.show(),那么这会窃取焦点并且不允许代码继续。

我觉得我应该使用的是性状数字(例如this)。我可以按照示例特征应用程序来运行更新滑块时实时更新的图形。但是,当我的代码要求更新时,我无法更新它;现在的焦点是visualization.configure_traits()'被盗'。

任何指针或适当的文档链接,将不胜感激。


编辑

大卫·温彻斯特的回答变得更近了一步,以解决方案。

但是,正如我在评论中指出的那样,我无法在time.sleep()步骤中用鼠标操作图形。正是在这一步中,在完整的程序中,计算机将忙于计算V的新值。在此期间,我希望能够操纵该数字,用鼠标旋转它。

+0

程序在我的最新评论,你可以简化代码和操作更新期间的数字是不带'time.sleep()'。这对你有用吗?由于Mayavi被移植到'qt',所以解决方案应该比使用'wx'更好:0 –

回答

1

如果使用wx后端,您可以定期调用wx.Yield()如果你想要一些长期过程与数据进行交互运行功能。在下面的例子中,wx.Yield()被称为每个“long running”函数的迭代,animate_sleep。在这种情况下,你可以开始与$ ipython --gui=wx <program_name.py>

import time 
import numpy as np 
from mayavi import mlab 
import wx 

V = np.random.randn(20, 20, 20) 
f = mlab.figure() 
s = mlab.contour3d(V, contours=[0]) 

def animate_sleep(x): 
    n_steps = int(x/0.01) 
    for i in range(n_steps): 
     time.sleep(0.01) 
     wx.Yield() 

for i in range(5): 

    animate_sleep(1) 

    V = np.random.randn(20, 20, 20) 

    # Update the plot with the new information 
    s.mlab_source.set(scalars=V) 
1

I瘦Mayavi使用generators来动画数据。这是为我工作:

import time 
import numpy as np 
from mayavi import mlab 

f = mlab.figure() 
V = np.random.randn(20, 20, 20) 
s = mlab.contour3d(V, contours=[0]) 

@mlab.animate(delay=10) 
def anim(): 
    i = 0 
    while i < 5: 
     time.sleep(1) 
     s.mlab_source.set(scalars=np.random.randn(20, 20, 20)) 
     i += 1 
     yield 

anim() 

我用这篇文章作为参考(Animating a mayavi points3d plot

+0

谢谢,这与我想要的非常接近。我发现虽然在睡眠阶段,我无法操纵这个数字。你也有这个问题吗?和任何解决方案? –

+0

你真的不需要睡觉,因为延迟是在我想的装饰器中给出的。你究竟在哪里试图操纵这个数字? –

+0

'操纵'我的意思是用鼠标旋转图像。睡眠步骤旨在模拟我的程序对数据进行一些处理。我的想法是,我希望可视化工具在执行慢程序期间显示数据,这可能只会每隔10秒左右产生一个新结果。 –