在我的项目中,我手动滚动了一个小对话框,可以用来选择一个键和/或鼠标组合,“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()
我刚刚在OSX11.4上运行了这个。适用于鼠标和按键事件。OSX上的重要部分(我怀疑Linux与OSX比Windows更相似)是父面板获得了焦点和事件。而且,
StaticText
无法获得焦点以下是工作代码:
相关问题 更多 >
编程相关推荐