I’m using Python 2.7.2 and wxPython 2.8.12.1 on Arch Linux x86_64.
I’d like to make the following example work this way:
* when left TextCtrl (text_A) has focus, by pressing Shift+A it should execute do_A(), and by pressing Shift+B it should write B in the text area; also, menu.foo.bar_B should be disabled (and menu.foo.bar_A enabled)
* when right TextCtrl (text_B) has focus, by pressing Shift+A it should write A in the text area, and by pressing Shift+B it should execute do_B(); also, menu.foo.bar_A should be disabled (and menu.foo.bar_B enabled)
import wx
class Foo(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, size=(600, 480))
self.init_menu()
self.init_text()
self.Centre()
self.Show(True)
def init_menu(self):
self.menu = wx.MenuBar()
self.SetMenuBar(self.menu)
self.menu.foo = wx.Menu()
self.menu.Append(self.menu.foo, "&Foo")
self.menu.foo.bar_A = self.menu.foo.Append(wx.ID_ANY, "Bar&A\tShift+A")
self.menu.foo.bar_B = self.menu.foo.Append(wx.ID_ANY, "Bar&B\tShift+B")
self.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A)
self.Bind(wx.EVT_MENU, self.handle_B, self.menu.foo.bar_B)
def init_text(self):
self.box = wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(self.box)
self.text_A = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.text_B = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.box.Add(self.text_A, 1, flag=wx.EXPAND)
self.box.Add(self.text_B, 1, flag=wx.EXPAND)
def handle_A(self, event):
print('A')
def handle_B(self, event):
print('B')
app = wx.App()
Foo()
app.MainLoop()
Binding to the menu event with something like self.text_A.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A) doesn’t work at all.
Should I make use wx.EVT_KILL_FOCUS and wx.EVT_SET_FOCUS to bind/unbind the menu items, set/reset the shortcut keys and enable/disable menu entries? It sounds complicated for larger applications, in general I’d like to know what’s the proper (most frequent, clean and tidy) way wxPython applications limit the scope of menu shortcut keys and dynamically enable/disable menu items.
Thank you!
I wrote up an article about menus a few years ago: http://www.blog.pythonlibrary.org/2008/07/02/wxpython-working-with-menus-toolbars-and-accelerators/
It talks about disabling menus in there. There’s also an example in the wxPython demo package about this. I think you have to bind the menu events to the frame object though so binding them to the text control probably won’t work. I do think the focus event is probably a better place to do the enable/disable bit though.
To unbind an event, use the UnBind method. See http://zetcode.com/wxpython/events/ or http://www.wxpython.org/docs/api/wx.EvtHandler-class.html for more info.