如何使用python获取vtk KeyPressEvent中的密钥代码

2024-10-01 07:11:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果我使用此模式,我的交互器样式没有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

但是,如果我使用工厂vtkInteractorStyleTrackballCamera类并使用此模式添加观察者,则同一个keyPress()可以访问GetKeySym()。在

^{pr2}$

我是个新手,我该怎么做才能在我的课堂上获得功能?在


Tags: keyselfeventobjreturndef模式keypress
3条回答

对,我在检查vtk doxygen,并发现vtkInteractorStyleTrackballCamera不是从{a2}继承的,我在移植的example中假定了这一点。我决定将我的样式类传递给父类,以便它可以访问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))

我在google上搜索“vtk keypressevent python”找到了这个问题,我只想分享我的解决方案,因为不需要子类化vtkInteractorStyle

def keypress_callback(obj, ev):
    key = obj.GetKeySym()
    print(key, 'was pressed')

render_interactor = vtk.vtkRenderWindowInteractor()
render_interactor.AddObserver('KeyPressEvent', keypress_callback, 1.0)

我认为这是一个安全的交互方式。我注意到在你的解决方案中,你把父母vtk.vtkrenderWindowInteractior(). 最好将父级设置为VTKrenderWindowInteractior的特定实例:

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

相关问题 更多 >