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

2024-10-02 02:41:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的项目中,我手动滚动了一个小对话框,可以用来选择一个键和/或鼠标组合,“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()

Tags: 代码selfeventbindmainlinux事件鼠标
1条回答
网友
1楼 · 发布于 2024-10-02 02:41:04

我刚刚在OSX11.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()

相关问题 更多 >

    热门问题