我正在使用wxPython。我有一个带有一堆按钮的wx.Dialog
和一个wx.TextCtrl
。每个按钮都是wx.Button
,通过wx.EVT_BUTTON
向其发送绑定事件。我按了几个按钮就可以了。然后我想打空格键。有趣的是,我有一个标有SPC的按钮,对应于空格键行为,这是一个额外的便利。我希望发生以下情况:
您按下键盘上的空格键,它会识别空格键事件
一个。您按下键盘上的空格键,焦点在wx.TextCtrl
...(工作)
湾你按下键盘上的空格键,焦点在wx.Button
,因为那样
是您处理的最后一个事件,并且识别出空格键事件(问题)
我做了:
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可以工作吗?也就是说,即使焦点当前位于按下的最后一个按钮上,我是否可以生成按键事件而不是按下最后一个按钮的命令事件。
答案 0 :(得分:1)
在对话框级别绑定到wxEVT_KEY_DOWN
无法正常工作,因为对话框永远不会发生此事件,按键事件将被发送到焦点窗口,对话框永远不会出现,焦点始终在其中一个孩子。另请注意,与命令事件键事件不同,不向上传播窗口层次结构。
因此,您可以在每个按钮级别处理此事件,也可以使用 发送到顶级父级的特殊wxEVT_CHAR_HOOK
事件,即对话框,完全允许此类窗口全局键盘处理逻辑。
请注意,在任何情况下,如果按Space除了激活当前关注的按钮之外的任何其他操作,对用户来说将会非常混乱,因为这是人们习惯的常见行为。因此,我强烈建议首先避免这样做。
答案 1 :(得分:0)
您可能必须将键事件绑定到每个单独的按钮,并检查是否按下了空格按钮。如果是这样,请调用空格键按钮事件调用的方法。否则,忽略该事件。您可以使用wx.AcceleratorTable,但我不确定。