如何使用python获取vtk KeyPress事件中的密钥代码

如何使用python获取vtk KeyPress事件中的密钥代码,python,vtk,Python,Vtk,我刚开始使用python中的vtk(6),在处理KeyPressEvent时遇到了一个问题。我想将VTKInteratorStyleTrackballCamera子类化 如果我使用这个模式,我的交互器样式没有getKeySym(),并且我无法解码按下的键 class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): def __init__(self,parent=None): sel

我刚开始使用python中的vtk(6),在处理KeyPressEvent时遇到了一个问题。我想将VTKInteratorStyleTrackballCamera子类化

如果我使用这个模式,我的交互器样式没有getKeySym(),并且我无法解码按下的键

    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()