我想做的是在循环中更新一个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()
,那么这就会窃取焦点,并且不允许代码继续。
visualization.configure_traits()
"偷走"了。
如有任何指示或适当文档的链接,将不胜感激。
编辑
David Winchester的答案离解决方案更近了一步。
然而,正如我在评论中指出的那样,在time.sleep()
步骤期间,我无法用鼠标操纵图形。在这一步骤中,在整个程序中,计算机将忙于计算v的新值。在此期间,我希望能够操纵图形,用鼠标旋转它等。
我认为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()
我用这篇文章作为参考(动画mayavi points3d情节)
如果使用wx
后端,如果希望在一些长时间运行的函数期间与数据交互,则可以定期调用wx.Yield()
。在下面的例子中,wx.Yield()
在每次迭代某个"长时间运行"的函数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)