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()
在我的项目中,我手动滚动了一个小对话框,可用于选择键 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()