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



在我的项目中,我手动滚动了一个小对话框,可以用来选择键和/或鼠标组合,"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的重要部分(我怀疑Linux更像OSX而不是Windows(是父面板获得了焦点和事件。此外,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()

最新更新