【问题标题】:VTK, Mayavi BUG: all `ButtonReleaseEvents` fail, yet all `ButtonPressEvents` work?VTK,Mayavi BUG:所有 `ButtonReleaseEvents` 都失败,但所有 `ButtonPressEvents` 工作?
【发布时间】:2018-09-10 23:53:26
【问题描述】:

我想在 mayavi 图中捕获mouse release 事件。具体来说,我需要单击一个对象,旋转它,然后在释放鼠标时接收输入。


尝试:

标准的 mayavi on_mouse_pick 无法检测到此类行为(请参阅下面代码中的 approach 1)。

然而,vtk(mayavi 是基于它构建的)确实有一个特定的LeftButtonReleaseEvent() 函数。这些知识是在以下位置找到的: https://www.vtk.org/doc/nightly/html/classvtkRenderWindowInteractor.html

我在下面编写了一个代码,它有效地使用了这个在线文档,并且可以从该列表中调用一个类似的函数:LeftButtonPressEvent()(参见下面的approach 2)。虽然 LeftButtonPressEvent() 有效,但不知何故 LeftButtonReleaseEvent() 无效(对于中键、右键单击也是如此)。

我已经绞尽脑汁好几天了 - 除了它是一个直接的错误之外,还有人理解这一点吗?任何人都可以在自己的计算机上进行测试以确保吗?

from __future__ import print_function
import numpy as np
from mayavi import mlab
from tvtk.api import tvtk

###################
### mayavi section:

fig1 = mlab.figure(1)
mlab.test_contour3d()
mlab.title('click me')

##############
# approach 1:
#def picker_callback(picker_obj):
    #print('click recieved')   
#fig1.on_mouse_pick(picker_callback)

##############
# approach 2:
def press_callback(vtk_obj, event):
    print('pressed')
def release_callback(vtk_obj, event):
    print('released')

fig1.scene.interactor.add_observer('LeftButtonPressEvent', press_callback) #works
fig1.scene.interactor.add_observer('LeftButtonReleaseEvent', release_callback) #doesn't work

mlab.show()

【问题讨论】:

  • 您确定要在鼠标释放时调用某些内容吗?释放鼠标按钮时调用“pick”回调(按下后不移动)
  • @FelipeLema 这个事实让我很兴奋,而且是个好主意,但事实证明,它只有在鼠标打开和鼠标关闭之间没有鼠标移动的情况下才有效。我需要的是用户抓住一个对象(鼠标打开),旋转它,然后释放(鼠标关闭),情节需要接受命令。
  • @FelipeLema 我已经从头开始更新了我的方法并编辑了我的初始帖子 - 代码现在尽可能简单,并隔离了直接错误。您有什么可以帮助的见解吗?
  • 您应该尝试EndInteractionEvent 而不是LeftButtonReleaseEvent。来源:github.com/enthought/mayavi/blob/…
  • @FelipeLema 谢谢!!惊人的帮助,我更新了一个提供完整解决方案的答案,同时忽略了所有其他事件(如缩放等)

标签: python events mouseevent vtk mayavi


【解决方案1】:

非常感谢 cmets 中的@FelipeLema 提供了这个很棒的答案!我已经将他的建议结合到之前编写的代码中来模拟自然的mouse release 事件:

from __future__ import print_function
import numpy as np
from mayavi import mlab
from tvtk.api import tvtk

###################
### mayavi section:

fig1 = mlab.figure(1)
mlab.test_contour3d()
mlab.title('click me')

click_on = 0

def press_callback(vtk_obj, event):
    global click_on
    click_on = 1
    print('pressed')

def release_callback(vtk_obj, event):
    global click_on
    if click_on == 1:
        print('released')
        click_on = 0

fig1.scene.interactor.add_observer('LeftButtonPressEvent', press_callback)
#fig1.scene.interactor.add_observer('LeftButtonReleaseEvent', release_callback) #doesn't work
fig1.scene.interactor.add_observer('EndInteractionEvent', release_callback) #solution!! (with above setup)

mlab.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2016-05-25
    • 2023-01-28
    • 1970-01-01
    • 2013-04-18
    • 2013-09-22
    相关资源
    最近更新 更多