Wxpython Mayavi:帮助重置鼠标选择器并将wx事件连接到@on_trait_change
我正在制作一个UI,其中包括在带有控件的wx框架中嵌入一个Mayavi视图,我遇到了一些问题。为了解决这个问题,我把他们的和结合在一起的工作;我的项目是一个更复杂的版本 我有两个问题:Wxpython Mayavi:帮助重置鼠标选择器并将wx事件连接到@on_trait_change,wxpython,enthought,mayavi,traitsui,Wxpython,Enthought,Mayavi,Traitsui,我正在制作一个UI,其中包括在带有控件的wx框架中嵌入一个Mayavi视图,我遇到了一些问题。为了解决这个问题,我把他们的和结合在一起的工作;我的项目是一个更复杂的版本 我有两个问题: 如果用户选择了不同数量的球,我希望清除该图形并使用一组新的球重新绘制。然而,根据我从谷歌上收集的信息,我需要在clf()调用之后重置选择器。我看到的类似示例对scene.activated trait使用@on_trait_change装饰器,但我不确定在场景未激活而只是更新时如何执行此操作 如果用户选择不同的球
顺便说一句,我想把这篇文章发到网站上,但网站似乎已经关闭了一段时间。有人注意到了同样的情况吗?我不确定我是否理解问题所在。要使代码正常工作,似乎只需在wx通知程序(您有一个参考)中调用场景并进行必要的调整。像这样:
def on_number_of_balls_selected():
n = self.get_selected_ball_number()
clear_figure()
#mlab.clf(scene = self.mayavi_view.scene.mayavi_scene )
# make some new points
new_points = somehow_make_some_new_points(n)
mlab.points3d( new_points, scene=self.mayavi_view.scene.mayavi_scene )
# reattach the picker
picker = self.mayavi_view.figure.on_mouse_pick(self.mayavi_view.picker_callback)
诸如此类,这些电话可能并不完全正确,但这是基本想法
如果使用traitsui,解决方案在概念上没有什么不同,但我很好奇,如果要使用traitsui渲染mayavi场景,为什么不同时使用它在GUI中显示枚举?这确实是traitsui(用于简单应用程序)的预期用途。如果你有理由不这么做的话——很好,在很多用例中,traitsui并不是最好的工具,使用工具包(或者说Enml,我个人并没有进行过公平的尝试)可以让你更灵活地控制布局并提供更广泛的小部件阵列。但是traitsui为这个问题提供了一个稍微好一点的解决方案,即当用户在GUI中更改某些数字时提供通知(尽管您仍然需要编写侦听器)
编辑:结果是tvtk选择器在mlab.clf
(合理)上自行分离,并防止侦听相同事件的新选择器重新连接(不太合理)。我相信这是tvtk中的一个bug,我无法在30分钟内将其隔离。因此,现在我建议完全避免mlab.clf
(我已经调整了上面的代码以反映这一点)。相反,调用每个源模块的remove
方法,该方法将导致源从场景中删除自身:
def clear_figure(self):
for child in self.scene.mayavi_scene.children:
child.remove()
之后,选择器将断开连接,但您可以创建新对象,然后像往常一样通过在鼠标上调用
\u pick
将选择器重新连接到新对象上。发件人:-->是的,我们的邮递员列表(Enthught dev、epd用户等)已关闭,对此不便深表歉意;我们正在升级我们的服务器。如上所述,我们现在的大部分公众支持都是stackoverflow,不过我们确实计划在服务器升级完成后恢复邮件列表。不幸的是,这种简单的方法不起作用。我已经用您的编辑更新了上面链接中的脚本,但是在其他地方(例如和)注意到clf()后重新附加选择器会出现此问题。这就是为什么我希望使用@on_trait_变更方法,因为我在别处看到过这种方法,但没有代码。Re:wx vs.traitsui的使用-我的项目是一个更大的预先存在的包的一部分,该包使用wx构造控制UI元素。我并没有和wx结婚,但我希望尽可能保持事情的一致性。好吧,这似乎是挑选者的一种奇怪行为。稍后,我将尝试看看在mlab.clf
中如何处理选择器。但你的第二个问题的答案仍然应该是直截了当的。既然你已经有了一个活动,为什么你还需要改变?您可以设置一个事件
特征来监听此事件,然后充当中介,但是为什么不设置glyph的颜色特征呢?(顺便说一句,你不需要使用trait的set
方法,你可以使用python赋值)我的原因是我一直被一些问题困扰着,比如,元素激活的顺序在哪里起作用。开发人员建议在“场景可用之前创建的可视化对象和属性”下使用“特性更改”上的@on\u trait\u change
方法。我想利用它来避免以后出现类似的错误。我对选取器的行为没有很好的理解——我试图查看tvtk的选取器对象调用底层VTK选取器的代码,试图找出哪里出了问题,但它很密集,我不得不花一些时间调试它。现在,我已经用一个变通方法更新了我的答案。