Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在wxPython中,如何将EVT_KEY_DOWN事件绑定到整个窗口?_Python_User Interface_Wxpython - Fatal编程技术网

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

在wxPython中,如何将EVT_KEY_DOWN事件绑定到整个窗口?,python,user-interface,wxpython,Python,User Interface,Wxpython,我可以将事件绑定到textctrl框。问题是必须在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.E

我可以将事件绑定到textctrl框。问题是必须在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, self.OnKeyDown)
self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5))
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown)

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

改为尝试绑定到
wx.EVT\u CHAR\u HOOK

e、 g


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

谢谢。这样做了。这让我的主窗口可以看到事件,但我的孩子们看不到。我的所有处理程序都包含event.Skip()。有什么建议吗?对不起,如何将按键关闭事件绑定到文本框?因为那正是我需要的
wx.EVT_KEY_DOWN(self.NudgeTxt,self.OnKeyDown)
似乎对我不起作用