2009-06-25

wxPython の Event.Skip()

wxPython のことなど。別に中学生と張り合っているわけではありません。張り合ってませんったら。



Ctrl+X とかの、キー押下イベントをキャッチしたいのです。でも TextCtrl を使っているので、特定のキーコンビネーション以外は通常通り処理したいわけです。まさか全てのパターンでの処理は書きたくない。



ウィジェットのほうを探しても見つからないなぁと思ったら、Event オブジェクトに Skip() メソッドというのがありました。

This method can be used inside an event handler to control whether further event handlers bound to this event will be called after the current one returns.

このメソッドをイベントハンドラ内で使用すると、そのイベントハンドラ終了後、既にバインドされている他のイベントハンドラでも処理するかどうかを制御できる。

ウィジェットではなくて、Event オブジェクトのメソッドなのですね。なるほどなぁ。



import wx

class App(wx.App):
    def OnInit(self):
        frame = Frame()
        frame.Show()
        return True

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="my frame")
        self._text = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self._text.Bind(wx.EVT_KEY_DOWN, self._handlekey)
        wx.BoxSizer(wx.VERTICAL).Add(self._text, flag=wx.EXPAND)

    def _handlekey(self, event):
        if (event.GetModifiers()&wx.MOD_CONTROL and
            event.GetKeyCode()==ord("X")):
            print "^X pressed"
        else:
            event.Skip() # <= ここ

if __name__ == "__main__":
    app = App(redirect=False)
    app.MainLoop()