Wxpython EVT_CHAR回调未被调用

时间:2012-09-25 16:30:04

标签: python wxpython

我有一个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的新手,虽然它对我来说很有意义,但我确信有一些我不知道的“陷阱”。

2 个答案:

答案 0 :(得分: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()

修复了问题。

答案 1 :(得分: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()