如何使用python获取vtk KeyPress事件中的密钥代码
我刚开始使用python中的vtk(6),在处理KeyPressEvent时遇到了一个问题。我想将VTKInteratorStyleTrackballCamera子类化 如果我使用这个模式,我的交互器样式没有getKeySym(),并且我无法解码按下的键如何使用python获取vtk KeyPress事件中的密钥代码,python,vtk,Python,Vtk,我刚开始使用python中的vtk(6),在处理KeyPressEvent时遇到了一个问题。我想将VTKInteratorStyleTrackballCamera子类化 如果我使用这个模式,我的交互器样式没有getKeySym(),并且我无法解码按下的键 class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): def __init__(self,parent=None): sel
class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self,parent=None):
self.AddObserver("MiddleButtonPressEvent",self.middleButtonPressEvent)
self.AddObserver("MiddleButtonReleaseEvent",self.middleButtonReleaseEvent)
self.AddObserver("KeyPressEvent",self.keyPress)
def keyPress(self,obj,event):
key = obj.GetKeySym() #Does not work
print("key %s" % key)
return
def middleButtonPressEvent(self,obj,event):
...
return
def middleButtonReleaseEvent(self,obj,event):
...
return
但是,如果我使用factory VTKInteratorStyleTrackBallCamera类并使用此模式添加观察者,则相同的keyPress()可以访问GetKeySym()
我是一个新手,我应该怎么做才能在我的类中获得功能?是的,在检查vtk doxygen并发现它没有继承我在移植时假设的内容后,我找到了一个解决方案。我决定将样式类传递给父类,以便它可以访问RenderWindow GetKeySym()。这可能不是最好的解决方案,但仅供参考:
class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self,parent=None):
self.parent = vtk.vtkRenderWindowInteractor()
if(parent is not None):
self.parent = parent
self.AddObserver("KeyPressEvent",self.keyPress)
def keyPress(self,obj,event):
key = self.parent.GetKeySym()
...
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetInteractorStyle(KeyPressInteractorStyle(parent = interactor))
如果您正在创建一个Interactor样式的类,我认为可以安全地假设它将作为某个点应用于Interactor。我注意到在您的解决方案中,您将父对象设置为vtk.vtkRenderWindowInteractor()。最好将父对象设置为vtkRenderWindowInteractor的特定实例:
class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self,parent=None):
self.parent = iren
self.AddObserver("KeyPressEvent",self.keyPressEvent)
def keyPressEvent(self,obj,event):
key = self.parent.GetKeySym()
if key == 'l':
print(key)
return
...
iren = vtk.vtkRenderWindowInteractor()
iren.SetInteractorStyle(MyInteractorStyle())
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Initialize()
iren.Start()
我通过谷歌搜索“vtk keypressevent python”发现了这个问题,只是想分享我的解决方案,因为不需要子类化
vtkInteractorStyle
:
def按键_回调(obj,ev):
key=obj.GetKeySym()
打印(按键“已按下”)
render_interactitor=vtk.vtkrenderWindowInteractitor()
render_Interactior.AddObserver('KeyPressEvent',keypress_回调,1.0)
根据“obj”的类别,这不起作用。公认的答案更好。
class MyInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
def __init__(self,parent=None):
self.parent = iren
self.AddObserver("KeyPressEvent",self.keyPressEvent)
def keyPressEvent(self,obj,event):
key = self.parent.GetKeySym()
if key == 'l':
print(key)
return
...
iren = vtk.vtkRenderWindowInteractor()
iren.SetInteractorStyle(MyInteractorStyle())
iren.SetRenderWindow(renWin)
renWin.Render()
iren.Initialize()
iren.Start()