【问题标题】:Is there anyway to override space bar behavior in wxPython on Windows?无论如何在Windows上覆盖wxPython中的空格键行为?
【发布时间】:2012-11-28 19:11:12
【问题描述】:

我正在使用 wxPython。我有一个带有一堆按钮的wx.Dialog,还有一个wx.TextCtrl。每个按钮都是一个wx.Button,通过wx.EVT_BUTTON 绑定事件。我按了几个按钮,他们就会做他们的事情。然后我想按空格键。有趣的是,我有一个标记为 SPC 的按钮,它对应于空格键的行为,以增加便利。我希望发生以下情况:

  1. 您按下空格键按钮,它会识别空格键事件(有效)
  2. 您按下键盘上的空格键,它会识别空格键事件

    一个。你按下键盘上的空格键,重点放在wx.TextCtrl ...(有效)

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

我已经完成了:

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

第一行允许案例 2a 工作

第二行没有效果,但我认为应该?我看到this old link 解决了完全相同的问题,并且似乎说像我的第二个代码行这样的操作将允许案例 2b 工作。无论如何,在情况 2b 中发生的情况是为最后按下的按钮生成命令事件。这应该是 Windows 的默认行为。

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

【问题讨论】:

    标签: windows wxpython wxwidgets


    【解决方案1】:

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

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

    请注意,在任何情况下,如果按空格键除了激活当前焦点按钮之外还有其他任何操作,用户会感到非常困惑,因为这是人们习惯的常见行为。所以我强烈建议一开始就避免这样做。

    【讨论】:

    • 我猜 EVT_CHAR_HOOK 正是我所希望的,谢谢。不管出于什么原因,我直觉地期望enter 是那个按钮来激活当前的焦点按钮,不知道我从哪里得到的?我会考虑我的选择。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多