Wxpython EVT_CHAR回调未被调用
我有一个OpenGL wxpython应用程序,我正试图在Ubuntu中使用它。它是(由其他人)在MacOSX上开发的,在那里工作得很好 我遇到的最后一个突出问题是没有捕获键盘事件 代码如下所示:Wxpython EVT_CHAR回调未被调用,python,wxpython,Python,Wxpython,我有一个OpenGL wxpython应用程序,我正试图在Ubuntu中使用它。它是(由其他人)在MacOSX上开发的,在那里工作得很好 我遇到的最后一个突出问题是没有捕获键盘事件 代码如下所示: class GLFrame(wx.Frame): def __init__(...): ... self.canvas.Bind(wx.EVT_MOTION, self.mouseMotion) self.canvas.Bind(wx.E
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调用对整个代码库进行了grepped,没有其他东西使用EVT_CHAR、EVT_KET_DOWN或EVT_KEY_UP。我也试过EVT_KEY_DOWN和EVT_KEY_UP,但都不起作用
我还尝试从更改绑定调用
self.canvas.Bind(...)
到
这会中断EVT_运动,EVT_CHAR回调仍然不会被调用
在到达GLFrame之前,是否有任何调用可能捕获键盘事件?我是wxpython的新手,虽然这对我来说很有意义,但我确信有一些我不知道的“陷阱” 尝试绑定到框架而不是画布
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()
根据wxpythongooglegroup,wx.Frame是否接收键盘事件取决于实现。Ubuntu实现没有接收到它们 发件人: wx.Frames是否能够捕获关键事件不是由wx和 因此,依赖于实现。事实上,它可能在某些方面起作用 平台基本上只是一个快乐的巧合。我不太清楚这件事 GLCanvas类,但如果它有焦点,我希望它能够。 你可能想通过做一些事情来再次检查焦点在哪里 比如从计时器之类的东西中打印wx.Window.FindFocus() 事实证明,GLCanvas可以很好地接收键盘事件。不管什么原因,它都没有得到关注。召唤
self.canvas.SetFocus()
已修复问题。画布是否有焦点?还可以尝试使用wx.ACCEPTS\u CHARS样式(我想就是这样了…),看起来样式是wx.WANTS\u CHARS。但是不起作用。非常确定画布有焦点。我试过这个(我问题的后半部分)。它没有修复EVT_字符,并且破坏了EVT_运动。你复制了这个精确的代码。。。因为它对我有用。。。您使用的wx版本是什么?什么蟒蛇?(TBH我在windows上,这可能就是为什么它对我有用…)有趣。我复制并粘贴了代码。EVT_运动正常,但EVT_字符已损坏。我正在运行Python 2.7.3和Python-wxgtk2.8.Im Py2.6,但我怀疑这就是问题所在。。可能是操作系统?…如果您先单击帧以确保它具有焦点,它是否工作?单击帧没有帮助。我可能会在某个地方添加一个文本字段,但这感觉像是一个黑客。。。
self.canvas.SetFocus()