【问题标题】:In wxPython how do you bind a EVT_KEY_DOWN event to the whole window?在 wxPython 中,如何将 EVT_KEY_DOWN 事件绑定到整个窗口?
【发布时间】:2011-04-03 23:18:23
【问题描述】:

我可以将事件绑定到 textctrl 框 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)

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

【问题讨论】:

  • 对不起,如何将按键按下事件绑定到文本框?因为这正是我需要的! wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown) 似乎不适合我

标签: python user-interface wxpython


【解决方案1】:

尝试绑定到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()

【讨论】:

  • 感谢伏打。做到了。
  • 这让我的主窗口可以看到该事件,但我的孩子们看不到它。我所有的处理程序都包括 event.Skip()。有什么建议吗?
【解决方案2】:

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

您需要在快捷键表中使用按钮或小部件的 ID,按下按钮将触发小部件的事件处理程序。

如果您没有希望触发其事件的小部件,并且希望使用某种具有事件绑定的“不可见”小部件,那么您可以这样做:

    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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多