【发布时间】: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