开发者

In wxPython how do you bind a EVT_KEY_DOWN event to the whole window?

开发者 https://www.devze.com 2023-01-12 22:11 出处:网络
I can bind an event to a textctrl box np.The problem is I have to be clicked inside of the textctrl box to \"catch开发者_JAVA百科\" this event.I am hoping to be able to catch anytime someone presses t

I can bind an event to a textctrl box np. The problem is I have to be clicked inside of the textctrl box to "catch开发者_JAVA百科" this event. I am hoping to be able to catch anytime someone presses the Arrow keys while the main window has focus.

NOT WORKING:

 wx.EVT_KEY_DOWN(self, self.OnKeyDown)

WORKING:

self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5))
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown)

I am pretty sure I am missing something easy. However am a bit stuck.


Instead try binding to wx.EVT_CHAR_HOOK

e.g..

self.Bind(wx.EVT_CHAR_HOOK, self.onKey)

  ...

def onKey(self, evt):
    if evt.GetKeyCode() == wx.WXK_DOWN:
        print "Down key pressed"
    else:
        evt.Skip()


You could use EVT_CHAR_HOOK,

    self.Bind(wx.EVT_CHAR_HOOK, self.hotkey)


def hotkey(self, event):
    code = event.GetKeyCode()
    if code == wx.WXK_LEFT:  # or whatever...
        ...

or use an accelerator table

    ac = [(wx.ACCEL_NORMAL, wx.WXK_LEFT, widget.GetId())]
    tbl = wx.AcceleratorTable(ac)
    self.SetAcceleratorTable(tbl)

you'll need to use a button or widgets' ID in the accelerator table, and pressing the button will trigger the widgets' event handler.

If you have no widgets that you'd like their events to be triggered, and would rather some kind of "invisible" widget that has event bindings, then you can do this:

    ac = []
    keys = [wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN]
    for key in keys:
        _id = wx.NewId()
        ac.append((wx.ACCEL_NORMAL, key, _id))
        self.Bind(wx.EVT_MENU, self.your_function_to_call, id=_id)

    tbl = wx.AcceleratorTable(ac)
    self.SetAcceleratorTable(tbl)

I iterate over the interested keys to bind to, and create new widgets IDs for them. I then use these IDs to bind menu items to (which accelerator keys trigger) and use these IDs in the accelerator table's list of tuples.

0

精彩评论

暂无评论...
验证码 换一张
取 消