VTK、Mayavi BUG:所有“ButtonReleaseEvents”都失败,但所有“ButtonPressEvents”都有效?

VTK, Mayavi BUG: all `ButtonReleaseEvents` fail, yet all `ButtonPressEvents` work?

我想在 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()

非常感谢@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()