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