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 (in the real application I would also dynamically disable
menu.foo.bar_B)
* 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() (in the real application I would also dynamically
disable menu.foo.bar_A)
···
#############################################
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()
#############################################
Of course dynamically disabling the menu items is not enough, in fact
the respective accelerators are not set free when items are disabled.
I know I can limit the scope of menu accelerators with instances of
wx.AcceleratorTable, but I want to display the key combinations in the
menu, and that way their scope will be extended to the whole window
anyway.
Thank you!