Mayavi窗口停止出现

时间:2016-12-05 22:12:22

标签: python windows vtk mayavi

我一直在python 3.5和windows 10机器上使用mayavi。今天我正在使用mayavi编写一些脚本,并且无缘无故(我知道)mayavi可视化窗口停止显示。事实上,任何mayavi示例都不再显示可视化窗口。脚本会在mlab.show()上等待,但它们不会显示任何内容。

我尝试过以下操作,但它仍然没有显示可视化窗口(每次只是在mlab.show()命令中等待):

  • 重新启动机器,然后重试。
  • pip install --upgrade for mayavi,vtk和pyQt4,然后再试一次。
  • 我创建了一个新的virtualenv并安装numpy,pyQt4,vtk,mayavi,然后再试一次。
  • 我用mlab.show运行boy.py示例(stop = True)。 stop = True显示一个带有按钮的窗口"停止交互"完成事件循环。我看到这个窗口但不是可视化窗口。我想也许窗户在那里但隐藏着。我发现WinLister允许您显示所有窗口。我可以看到最后打开的窗口是两个QWidget,一个用于关闭按钮的窗口,它显示为可见,另一个显示为不可见。我将该窗口切换为可见,我看到一个可能是mayavi可视化窗口的窗口,但它都是空白的。
  • 如果我逐步调用mlab.show(),我看到它最终会转到site-packages / pyface / utils / guisupport.py中的函数start_event_loop_qt4(),它会无限期地等待对app.exec_的调用( ),没有别的事情发生。
  • 我已经安装了新的Python 3.5.2,创建了一个新的虚拟环境并安装了numpy,pyQt4,vtk,mayavi,然后再试一次,同样的问题。
  • 我去了另一台机器并安装了numpy,pyQt4,vtk,mayavi,这些例子运作良好(只是检查我不会发疯)。

可能不相关,但在窗口停止显示之前我做的最后一件事是从mayavi属性窗口录制一个脚本,我想看看哪些命令对应于将视点移动到某个地方。一旦我看到正在录制的命令,我就复制它们并关闭mayavi可视化窗口而不停止录制。从那一刻起,我经历了所描述的问题。

UPDATE:

我一直在调试有效的机器上的boy.py示例,以及那些没有(两台机器都具有相同软件配置)的机器,我发现了第一点他们的执行偏离了。

创建数字时:

mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1))

工作的机器打开一个空的vtk / mayavi窗口,没有工作的机器不会打开任何东西。

我单步执行figure函数(在没有工作的机器中),我发现执行堆栈中的这一点开始偏离:

boy.py,  line 23
  mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1))
figure.py,  line 68, in figure
  engine.new_scene(name=name, size=size)
recordable.py,  line 45, in _wrapper
  result = func(*args, **kw)
engine.py,  line 452, in new_scene
  viewer = self.scene_factory(**factory_kwargs)

viewer是一个 mayavi.core.null_engine.DummyViewer 对象, 它在工作机器中的位置是一个 mayavi.core.ui.mayavi_scene.MayaviViewer 对象

我还发现传递给self.scene_factory的 factory_kwargs {} 的机器中没有工作,并且 {' size':(400,350)} 在它运行的机器中。

我试图了解scene_factory的工作原理,但这有点令人生畏。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案!

单步执行mlab.figure()的代码,我发现执行堆栈的这一点:

boy.py,  line 23
  mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1))
figure.py,  line 63, in figure
  engine = get_engine()
engine_manager.py,  line 101, in get_engine
  return self.new_engine()
engine_manager.py,  line 154, in new_engine
  elif options.backend == 'test':

后端是'test',它实例化了一个

engine = NullEngine(name='Null Mlab Engine')
在后端工作的机器中的

是'auto'并且它实例化了一个

engine = Engine(name='Mlab Engine')

所以我搜索了这个后端是如何设置的,与 mayavi.preferences.prefence_manager.py 相关的东西我看到在同一个文件夹中有一个 preferences.ini 。但是,它已将变量设置为 backend ='auto'

然后我发现脚本 mayavi.scripts.mayavi2.py 显示了一个数据可视化工具。如果我们选择菜单选项工具/偏好设置/ Mayavi / Mlab ,则字段后端设置为“测试”。我将其更改为'auto',然后mayavi boy.py示例再次开始工作!

令人困惑的是,我回到原来的Python 3.5安装和我原来的virtualenv。我运行了boy.py示例,它无需在该安装上执行任何操作。所以我怀疑这些设置是存储在python或virtualenv文件夹之外的其他地方,也许是在Windows注册表中?这就是为什么重新安装mayavi,即使在新的virtualenv和新的python安装没有解决问题!

我不确定后端是如何改变的,也许我在试验mayavi时自己改变了。但是,我认为这些首选项不应该在virtualenv或正在使用的python安装之外持久化。