在wxPython中,如何将EVT_KEY_DOWN事件绑定到整个窗口?

2024-05-19 12:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以将事件绑定到textctrl box np。问题是必须在textctrl框内单击以“捕获”此事件。我希望能够捕捉到任何时候有人按下箭头键,而主窗口有焦点。

不工作:

 wx.EVT_KEY_DOWN(self, self.OnKeyDown)

工作:

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

我很确定我错过了一些简单的事情。但是我有点卡住了。


Tags: keyselfboxnp事件焦点evtdown
2条回答

而是尝试绑定到wx.EVT_CHAR_HOOK

例如:。。

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()

你可以用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...
        ...

或者使用加速表

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

您需要在加速器表中使用一个按钮或widgets的ID,按下该按钮将触发widgets的事件处理程序。

如果没有希望触发其事件的小部件,并且希望某种具有事件绑定的“不可见”小部件,则可以执行以下操作:

    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)

我遍历要绑定到的感兴趣的键,并为它们创建新的widgets id。然后使用这些id将菜单项绑定到(加速器键触发的)并在加速器表的元组列表中使用这些id。

相关问题 更多 >