Wxpython Mayavi:帮助重置鼠标选择器并将wx事件连接到@on_trait_change

Wxpython Mayavi:帮助重置鼠标选择器并将wx事件连接到@on_trait_change,wxpython,enthought,mayavi,traitsui,Wxpython,Enthought,Mayavi,Traitsui,我正在制作一个UI,其中包括在带有控件的wx框架中嵌入一个Mayavi视图,我遇到了一些问题。为了解决这个问题,我把他们的和结合在一起的工作;我的项目是一个更复杂的版本 我有两个问题: 如果用户选择了不同数量的球,我希望清除该图形并使用一组新的球重新绘制。然而,根据我从谷歌上收集的信息,我需要在clf()调用之后重置选择器。我看到的类似示例对scene.activated trait使用@on_trait_change装饰器,但我不确定在场景未激活而只是更新时如何执行此操作 如果用户选择不同的球

我正在制作一个UI,其中包括在带有控件的wx框架中嵌入一个Mayavi视图,我遇到了一些问题。为了解决这个问题,我把他们的和结合在一起的工作;我的项目是一个更复杂的版本

我有两个问题:

  • 如果用户选择了不同数量的球,我希望清除该图形并使用一组新的球重新绘制。然而,根据我从谷歌上收集的信息,我需要在clf()调用之后重置选择器。我看到的类似示例对scene.activated trait使用@on_trait_change装饰器,但我不确定在场景未激活而只是更新时如何执行此操作
  • 如果用户选择不同的球颜色,我只想在不重新创建场景的情况下就地更改颜色。似乎我可以通过使用来实现这一点,我想最好使用@on_trait_change来调用它。但是,我不知道如何最好地将wx触发事件连接到允许触发@on_trait_更改的trait类型
  • 提前谢谢


    顺便说一句,我想把这篇文章发到网站上,但网站似乎已经关闭了一段时间。有人注意到了同样的情况吗?

    我不确定我是否理解问题所在。要使代码正常工作,似乎只需在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选取器的代码,试图找出哪里出了问题,但它很密集,我不得不花一些时间调试它。现在,我已经用一个变通方法更新了我的答案。