2012-01-03 63 views
5

wx.Frameで発生するキーボードイベントをキャプチャしようとしています。これらのイベントをキャプチャするには、次のコードが必要です。私は、コードを実行したときしかし、ハンドラは、OnKeyDownが呼び出されることはありません:wxpythonでwx.Frameでキーボードイベントを取得する

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.Bind(wx.EVT_KEY_UP, self.OnKeyDown) 
     self.Bind(wx.EVT_CHAR, self.OnKeyDown) 
     self.SetFocus() 
     self.Show(True) 

    def OnKeyDown(self, event=None): 
     log.debug("OnKeyDown event %s" % (event)) 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

誰もがこれを行う方法を知っている場合、私はいくつかの助けをいただければ幸いです。

答えて

3

log.warningを使用すると、コードは機能します。

log.warning("OnKeyDown event %s" % (event)) 

ログレベルは次のとおりです。

Level Value 
CRITICAL 50 
ERROR  40 
WARNING 30 
INFO  20 
DEBUG  10 
UNSET  0 

デフォルトのログレベルは警告されます。デフォルトより高いレベルのログのみが生成されます。したがって、デフォルトレベル(30)では、log.infolog.debugも出力を生成しません。

編集後のOPコメント:適切なログレベルを設定すると、winXP 32bitとwin7 64bit、python 2.6、wxpython 2.8.11、2.8.12で完全に動作するようになります。しかし、コードは私が知らない何らかの理由でubuntuで動作しません。この違いは、wxwidgetsがどのように異なるSOに実装されているのか、ロギングでは実装されていないのかに関係しています。 すでに発見したように、ubuntuで動作するためには、追加するパネルと適切なログレベルの使用が必要です。したがって、これは動作します:

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 
     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.Bind(wx.EVT_KEY_DOWN, self.KeyDown) 
     self.Bind(wx.EVT_KEY_UP, self.KeyDown) 
     self.Bind(wx.EVT_CHAR, self.KeyDown) 
     self.panel.SetFocus() 

    def KeyDown(self, event=None): 
     logging.warning("OnKeyDown event %s" % (event)) 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    gui.Show() 
    app.MainLoop() 
+1

私はこの変更を試みて、ロギングパッケージを使用しないようにしました。いずれの変更も機能しませんでした。 – Kevin

+0

@ケビン、あなたの答えのコードは、あなたの質問や私の答えの1つは、ロギングを排除さえしない意味ですか?どんなSO、python、wxPythonのバージョンを使っていますか?これはwin7とwinXP、Python 2.6、wxpython 2.8.11と2.8.12でテストされています。 – joaquin

+0

私はUbuntu 11.04 64bitを使用しています。これは既に推測しているようです。だから、OSに基づいた奇抜ですが、パネルをフレームに追加するのは簡単な回避策です。 – Kevin

6

私はフレームにパネルを追加することができ、パネルはキーボードイベントをはるかに受け入れやすいとわかりました。

import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.panel.Bind(wx.EVT_KEY_UP, self.OnKeyDown) 
     self.panel.Bind(wx.EVT_CHAR, self.OnKeyDown) 
     self.panel.SetFocus() 
     self.Show(True) 

    def OnKeyDown(self, event=None): 
     print "Event!" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 
+0

@joaquin:感度*が最良の用語であるかどうかはわかりませんが、これは良い答えです。私はUbuntuで同じ問題を抱え、 'wx.Frame'でキーイベントを捕捉できませんでした。 'SetFocus()'と一緒に 'wx.Panel'を追加すると、この問題が解決されました。 – shinjin

関連する問題