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