2015-05-28 162 views
1

以下代码(导入除外)在循环中执行,其中有4个数字打开并绘制简单图形。但是,当mayavi场景创建时,程序将停止并且只会继续,一次!all!数字已关闭! 它停止打印之间命令前/后:Python脚本不会继续,直到mayavi场景窗口关闭

from mayavi import mlab as mayavi_mlab 


plot_extent = (-20, 20, 0, 30, 0, 1) 
s= mayavi_mlab.surf(x, y, z, colormap='PuBu',extent=plot_extent, vmin=-0.5, vmax=0.5) 

mayavi_mlab.axes(s, color=(.7, .7, .7), extent=plot_extent,ranges=(-120, 120, 0, 10J,0,1), xlabel='site i', ylabel='energy E',x_axis_visibility=True, y_axis_visibility=True, z_axis_visibility=False) 
mayavi_mlab.view(azimuth=-90, elevation=35, distance=70, focalpoint=None) 

print('before')   
mayavi_mlab.show() 
print('after') 

我在做什么错? 平台:操作系统x 10.9.5

Python 2.7.9 | Anaconda 2.1.0(x86_64)| (默认情况下,2014年12月15日,10点37分34秒) [GCC 4.2.1(苹果公司建立5577)对达尔文

回答

0

docs for mayavi.mlab.show状态:

默认情况下,该功能只是简单地创建一个GUI并在需要时启动它的事件循环。

因此mayavi_mlab.show()将启动主事件循环,并且不会返回,直到此循环结束。但是,只有这样,全部数字已经关闭,并且不显示UI。

如果你不想让这部分代码被阻塞,你应该使用threadingmultiprocessing或任何其他并发库或方法。如果你想快速度实现这一目标,os.fork()可能就够:

print('before') 
if os.fork() == 0: 
    try: 
     mayavi_mlab.show() 
    finally: 
     os._exit(os.EX_OK) 
print('after') 

但请记住,这将留给你一个Zombie processes

+0

为什么你会使用'os.fork'而不是'threading' – aestrivex

+0

因此'threading'是列表中的第一个。但是'os.fork'也可以使用。根据需要,它甚至可能比使用线程有一些优势。 – tynn