反正有没有在Windows上的wxPython中覆盖空格键行为?

时间:2012-11-28 19:11:13

标签: windows wxpython wxwidgets

我正在使用wxPython。我有一个带有一堆按钮的wx.Dialog和一个wx.TextCtrl。每个按钮都是wx.Button,通过wx.EVT_BUTTON向其发送绑定事件。我按了几个按钮就可以了。然后我想打空格键。有趣的是,我有一个标有SPC的按钮,对应于空格键行为,这是一个额外的便利。我希望发生以下情况:

  1. 您按下空格键按钮,它会识别空格键事件(正常工作)
  2. 您按下键盘上的空格键,它会识别空格键事件

    一个。您按下键盘上的空格键,焦点在wx.TextCtrl ...(工作)

    湾你按下键盘上的空格键,焦点在wx.Button,因为那样   是您处理的最后一个事件,并且识别出空格键事件(问题)

  3. 我做了:

    self.typingWindow.Bind(wx.EVT_KEY_DOWN, self.popup)
    self.Bind(wx.EVT_KEY_DOWN, self.popup)
    

    第一行允许案例2a工作

    第二行没有效果,但我认为应该?我看到this old link解决了完全相同的问题,它似乎说我做第二个代码行之类的东西会让case 2b工作。无论如何,在情况2b中发生的事情是为按下的最后一个按钮生成命令事件。这应该是Windows的默认行为。

    所以我的问题是我的案例2b可以工作吗?也就是说,即使焦点当前位于按下的最后一个按钮上,我是否可以生成按键事件而不是按下最后一个按钮的命令事件。

2 个答案:

答案 0 :(得分:1)

在对话框级别绑定到wxEVT_KEY_DOWN无法正常工作,因为对话框永远不会发生此事件,按键事件将被发送到焦点窗口,对话框永远不会出现,焦点始终在其中一个孩子。另请注意,与命令事件键事件不同,向上传播窗口层次结构。

因此,您可以在每个按钮级别处理此事件,也可以使用 发送到顶级父级的特殊wxEVT_CHAR_HOOK事件,即对话框,完全允许此类窗口全局键盘处理逻辑。

请注意,在任何情况下,如果按Space除了激活当前关注的按钮之外的任何其他操作,对用户来说将会非常混乱,因为这是人们习惯的常见行为。因此,我强烈建议首先避免这样做。

答案 1 :(得分:0)

您可能必须将键事件绑定到每个单独的按钮,并检查是否按下了空格按钮。如果是这样,请调用空格键按钮事件调用的方法。否则,忽略该事件。您可以使用wx.AcceleratorTable,但我不确定。