wxPython,关键事件在 MacOS 和 Linux 上不显示

wxPython, key events not showing up on MacOS and Linux

在我的项目中,我手动滚动了一个小对话框,可用于选择键 and/or 鼠标组合,“S”或“CTRL-SHIFT-C”或其他。我在 Linux 和 Windows 上运行良好,但是当我去 Mac 上查看时,对话框只响应鼠标事件。

我将它归结为一个约 30 行的最小示例,实际上它在 Linux 上以相同的方式被破坏,鼠标事件但没有键盘。 Windows 我的最小代码按预期工作。

我看过演示代码,我觉得我做的和他们做的完全一样,所以我很困惑,尤其是简单的代码在 Linux.让关键事件可靠地跨平台工作是否有什么神奇或秘诀?

import wx

class Main(wx.Frame):

def __init__(self, parent):
    wx.Frame.__init__(self, parent, style=wx.WANTS_CHARS|wx.DEFAULT_FRAME_STYLE)

    sizer = wx.BoxSizer(wx.VERTICAL);
    desc = wx.StaticText( self, -1, "I receive mouse events but not kbd events")
    sizer.Add( desc, 1, wx.ALL, 25);

    for i in [self, desc]:
        i.Bind(wx.EVT_CHAR_HOOK       , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_CHAR            , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_KEY_DOWN        , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_KEY_UP          , self.OnKeyOrMouseEvt )

        i.Bind(wx.EVT_LEFT_DOWN       , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_MIDDLE_DOWN     , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_RIGHT_DOWN      , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_MOUSE_AUX1_DOWN , self.OnKeyOrMouseEvt )
        i.Bind(wx.EVT_MOUSE_AUX2_DOWN , self.OnKeyOrMouseEvt )

    self.SetSizerAndFit(sizer);

def OnKeyOrMouseEvt(self, event):
    print(f"I have received an event: {event}")
    event.Skip()

if __name__ == "__main__":
    app = wx.App()
    main = Main(None)
    main.Show()
    app.MainLoop()

我只是在 OSX 11.4 上 运行 这个。适用于鼠标和按键事件。 OSX 上的 impo运行t 部分(我怀疑 Linux 因为它比 Windows 更类似于 OSX)是父面板正在获取焦点和事件。另外,StaticText无法获得焦点。

这是工作代码:

import wx


class Main(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent, style=wx.WANTS_CHARS|wx.DEFAULT_FRAME_STYLE)

        panel = wx.Panel(self, wx.ID_ANY)
        panel.Bind(wx.EVT_KEY_DOWN, self.on_mouse_key_event)
        panel.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_key_event)

    def on_mouse_key_event(self, event):
        print(f'{event}')

# Run the program
if __name__ == '__main__':
    app = wx.App()
    main = Main(None)
    main.Show()
    app.MainLoop()