Windows 上 VTK 中的箭头键事件
Arrow-key events in VTK on Windows
为什么箭头按键事件没有转发到 Windows 上的 vtkRenderWindowInteractor?有解决方法吗? Windows 和 Mac 上的箭头键事件之间是否存在一般差异?
我可以使用以下示例代码重现该问题。在 Mac OS 上,如果我按箭头键,我会看到 'Up'、'Down'、'Left' 和 'Right'。但是在 Windows 上,我什么也没看到(没有输入回调)。我想知道为什么会这样。
我将 VTK 6.2.0 用于 python 2.7。我在 Windows Server 2012(类似于 Windows 8)和 Windows 7(在虚拟机上)上进行了测试,显示了相同的行为。
# -*- coding: utf-8 -*-
import vtk
import sys
class ClickInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self, parent=None):
self.AddObserver("CharEvent",self.onKeyPressEvent)
def onKeyPressEvent(self, renderer, event):
key = self.GetInteractor().GetKeySym()
print key
self.OnChar()
def run():
sphereSource = vtk.vtkSphereSource()
sphereSource.SetCenter(0.,0.,0.)
sphereSource.SetRadius(1.)
sphereSource.Update()
sphereMapper = vtk.vtkPolyDataMapper()
sphereMapper.SetInputConnection(sphereSource.GetOutputPort())
sphereActor = vtk.vtkActor()
sphereActor.SetMapper(sphereMapper)
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
style = ClickInteractorStyle()
renderWindowInteractor.SetInteractorStyle(style)
style.SetCurrentRenderer(renderer)
renderer.AddActor(sphereActor)
renderWindow.Render()
renderWindowInteractor.Start()
###############################################################################
# MAIN
###############################################################################
if __name__ == "__main__":
try:
run()
except:
print "Unexpected error: %s", sys.exc_info()[0]
raise
这解决了我的问题:替换
self.AddObserver("CharEvent",self.onKeyPressEvent)
和
self.AddObserver("KeyPressEvent",self.onKeyPressEvent)
为什么箭头按键事件没有转发到 Windows 上的 vtkRenderWindowInteractor?有解决方法吗? Windows 和 Mac 上的箭头键事件之间是否存在一般差异?
我可以使用以下示例代码重现该问题。在 Mac OS 上,如果我按箭头键,我会看到 'Up'、'Down'、'Left' 和 'Right'。但是在 Windows 上,我什么也没看到(没有输入回调)。我想知道为什么会这样。
我将 VTK 6.2.0 用于 python 2.7。我在 Windows Server 2012(类似于 Windows 8)和 Windows 7(在虚拟机上)上进行了测试,显示了相同的行为。
# -*- coding: utf-8 -*-
import vtk
import sys
class ClickInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self, parent=None):
self.AddObserver("CharEvent",self.onKeyPressEvent)
def onKeyPressEvent(self, renderer, event):
key = self.GetInteractor().GetKeySym()
print key
self.OnChar()
def run():
sphereSource = vtk.vtkSphereSource()
sphereSource.SetCenter(0.,0.,0.)
sphereSource.SetRadius(1.)
sphereSource.Update()
sphereMapper = vtk.vtkPolyDataMapper()
sphereMapper.SetInputConnection(sphereSource.GetOutputPort())
sphereActor = vtk.vtkActor()
sphereActor.SetMapper(sphereMapper)
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
style = ClickInteractorStyle()
renderWindowInteractor.SetInteractorStyle(style)
style.SetCurrentRenderer(renderer)
renderer.AddActor(sphereActor)
renderWindow.Render()
renderWindowInteractor.Start()
###############################################################################
# MAIN
###############################################################################
if __name__ == "__main__":
try:
run()
except:
print "Unexpected error: %s", sys.exc_info()[0]
raise
这解决了我的问题:替换
self.AddObserver("CharEvent",self.onKeyPressEvent)
和
self.AddObserver("KeyPressEvent",self.onKeyPressEvent)