Wxpython 使用Command-W或Control-W关闭帧

Wxpython 使用Command-W或Control-W关闭帧,wxpython,wxwidgets,Wxpython,Wxwidgets,我有一个wx.Frame子类,用户应该能够通过按Command-W(在OSX上)或Control-W(在Windows上)来关闭它。我的代码看起来像 def MyWindow(wx.Frame): def __init__(self): # ... self.Bind(wx.EVT_KEY_DOWN, self.handle_key) # ... def handle_key(self, event): if ev

我有一个wx.Frame子类,用户应该能够通过按Command-W(在OSX上)或Control-W(在Windows上)来关闭它。我的代码看起来像

def MyWindow(wx.Frame):
    def __init__(self):
        # ...
        self.Bind(wx.EVT_KEY_DOWN, self.handle_key)
        # ...

    def handle_key(self, event):
        if event.GetKeyCode() == wx.WXK_CONTROL_W:
            self.Destroy()
在Windows下,
handle\u键
不执行任何操作,直到我通过单击帧来聚焦帧。之后,按a键触发handle\u键,但Ctrl和W键触发函数的单独调用,因此条件永远不会满足

在OSX下,任何按键都不会调用
handle\u key
,即使我在
框架内单击以设置焦点后也是如此

我如何实现这个按键处理程序以便

  • 它的行为在不同平台上是一致的,除了Ctrl和Cmd,以及
  • 位于最前面时,用户可以随时按下组合键,而不管哪个窗口实际具有焦点

  • 你应该使用AcceleratorTable,而不是自己去抓键盘。以下是指向文档的链接:

    您可能会发现本教程也很有帮助:

    在您的情况下,代码如下所示:

    exitId = wx.NewId()
    self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
    
    accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('W'), exitMenuItem.GetId()) ])
    self.frame.SetAcceleratorTable(accel_tbl)
    

    使用加速器表的建议很好。但是为了完整性,如果您确实需要处理Ctrl/Cmd+W,那么您的代码应该如下所示:

    exitId = wx.NewId()
    self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
    
    accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('W'), exitMenuItem.GetId()) ])
    self.frame.SetAcceleratorTable(accel_tbl)
    
    def handle_键(self,event):
    如果event.GetKeyCode()='W'和event.GetModifiers()==wxMOD\U控件:
    # ... 无论什么
    

    请注意,
    wxMOD\u控件
    在Mac下实际上是Cmd(并且您有一个单独的
    wxMOD\u RAW\u控件
    ,如果您确实想在所有平台下使用Ctrl键,可以使用该控件)。

    使用Command-W或CONTROL-W关闭帧

    使用Ctrl-W关闭wx.Frame的简单示例:

    import wx
    class MyForm(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(500,500))
            panel = wx.Panel(self, wx.ID_ANY)
    
    
            #attach the key bind event to accellerator table
            randomId = wx.NewId()
            self.Bind(wx.EVT_MENU, self.onKeyCombo, id=randomId)
            accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('W'), randomId )])
            self.SetAcceleratorTable(accel_tbl)
    
        #method invoked on key press
        def onKeyCombo(self, event):
            print "You pressed CTRL+W!"
            self.Destroy()
    
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MyForm()
        frame.Show()
        app.MainLoop()
    
    资料来源: