2012-09-25 66 views
1

我有一个OpenGL的wxpython应用程序,我试图在Ubuntu工作。它是由Mac OSX开发的(由其他人),并且在那里工作得很好。Wxpython EVT_CHAR回调没有被调用

我最近遇到的问题是键盘事件没有被捕获。

的代码看起来是这样的:

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 

我grepped整个代码库绑定调用,而不是其他使用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的新手,尽管它对我来说很有意义,但我确信有一些我不知道的“陷阱”。

+0

画布是否有焦点?也尝试使用wx.ACCEPTS_CHARS风格(我认为它...) –

+0

它看起来像样式是wx.WANTS_CHARS。虽然不起作用。很确定画布有重点。 –

回答

1

按照wxPython的谷歌组,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() 

修复了这个问题。

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

我试过这个(我的问题的后半部分)。它没有修复EVT_CHAR,并打破了EVT_MOTION。 –

+0

你复制了这个确切的代码? ...因为它适用于我...你使用的是什么wx版本?什么python? (TBH在窗户上,这可能是为什么它适用于我...) –

+0

有趣。我复制并粘贴了代码。 EVT_MOTION有效,但EVT_CHAR已损坏。我正在运行Python 2.7.3和python-wxgtk2.8。 –