2016-10-03 50 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秒左右產生一個新結果。 –