2

我有一个 OpenGL wxpython 应用程序,我正在尝试在 Ubuntu 中工作。它是在 Mac OSX 上(由其他人)开发的,在那里工作得很好。

我遇到的最后一个突出问题是键盘事件没有被捕获。

代码看起来像这样:

class GLFrame(wx.Frame):
     def __init__(...):
         ...
         self.canvas.Bind(wx.EVT_MOTION, self.mouseMotion)
         self.canvas.Bind(wx.EVT_CHAR, self.character)
         ...

def character(self, evt):
    print "EVT_CHAR"
    # do stuff

def mouseMotion(self, evt):
    print "EVT_MOTION"
    # do stuff

我已经为 Bind 调用准备了整个代码库,没有其他东西在使用 EVT_CHAR、EVT_KET_DOWN 或 EVT_KEY_UP。我也尝试过 EVT_KEY_DOWN 和 EVT_KEY_UP,但它们都不起作用。

我也尝试过更改绑定调用

self.canvas.Bind(...)

self.Bind(...)

这会破坏 EVT_MOTION,并且仍然不会调用 EVT_CHAR 回调。

是否有任何调用可以在键盘事件到达 GLFrame 之前捕获它们?我是 wxpython 的新手,虽然它对我来说很有意义,但我确信有一些我不知道的“陷阱”。

4

2 回答 2

2

根据 wxpython Google 小组的说法,wx.Frame 是否接收键盘事件取决于实现。Ubuntu 实现不接收它们。

来自:https ://groups.google.com/d/msg/wxpython-users/dF2gf5KvFhE/M_-aRuG3aWUJ

wx.Frames 是否能够捕获关键事件不是由 wx 定义的,因此取决于实现。它可能在某些平台上运行的事实基本上只是一个快乐的巧合。我不确定 GLCanvas 类,但如果它有焦点,我希望它能够做到。您可能需要通过从计时器或其他东西执行“打印 wx.Window.FindFocus()”之类的操作来仔细检查焦点所在的位置。

事实证明,GLCanvas 可以很好地接收键盘事件。不管什么原因,它没有得到焦点。打电话

self.canvas.SetFocus()

解决了这个问题。

于 2012-10-04T17:23:59.173 回答
0

尝试绑定到框架而不是画布..

class GLFrame(wx.Frame):
    def __init__(self,*args,**kwargs):
        wx.Frame.__init__(self,*args,**kwargs)
        self.Bind(wx.EVT_MOTION, self.mouseMotion)
        self.Bind(wx.EVT_CHAR, self.character)


    def character(self, evt):
        print "EVT_CHAR"
        # do stuff

    def mouseMotion(self, evt):
        print "EVT_MOTION"

a = wx.App(redirect=False)
f = GLFrame(None,-1)
f.Show()
a.MainLoop()
于 2012-09-25T18:07:30.797 回答