2012-09-25 98 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。 –

相關問題