我想用一个mayavi人物捕捉mouse release
事件。具体来说,我需要单击一个对象,旋转它,然后在释放鼠标时接收输入。
尝试:
标准的mayavion_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()