Search code examples
pythonwxpython

Using accelerator table without menuitem


I have a wxpython desktop application and I am using python 2.7 and wxpython 2.8.

I know how to add an accelerator table to a menuitem but I would like to fire an event when a user press a certain combination of keys without having a menuitem. The user could have the focus on any field in my UI but when he press (for instance) CTRL-L an event should be fired. How to do this ?

Thanks for any help


Solution

  • You always need to bind your accelerator table items to wx.EVT_MENU, but wxPython doesn't require that you use a menu item object. Here's a simple example:

    import wx
    
    class MyForm(wx.Frame):
    
        #----------------------------------------------------------------------
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(500,500))
    
            # Add a panel so it looks the correct on all platforms
            panel = wx.Panel(self, wx.ID_ANY)
    
            randomId = wx.NewId()
            self.Bind(wx.EVT_MENU, self.onKeyCombo, id=randomId)
            accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL,  ord('Q'), randomId )])
            self.SetAcceleratorTable(accel_tbl)
    
            text = wx.TextCtrl(panel)
            text.SetFocus()
    
        #----------------------------------------------------------------------
        def onKeyCombo(self, event):
            """"""
            print "You pressed CTRL+Q!"
    
    # Run the program
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MyForm()
        frame.Show()
        app.MainLoop()
    

    In this example, we just create a random id, bind that id to an event handler and then create an accelerator that will fire that handler, which in this case is CTRL+Q. To make things more interesting, I added a text control widget and set the focus to that. Then if you press CTRL+Q, you should see the event handler fire and some text appear in your console window.

    You can read more about accelerators here: