title: WxPython, popup menus, callbacks and Windows XP
body: <p>My goal: the user clicks a button.  From the button pops up a two-level menu.  The user clicks on something, and this triggers a callback which does stuff.</p>
  
  <p>Here is a minimal example:</p>
  
  <pre><code>import wx
  
  class MyApp(wx.App):
      def OnInit(self):
          frame = TestFrame(None, -1, "Hello from wxPython")
          frame.Show(True)
          self.SetTopWindow(frame)
          return True
  
  class TestFrame(wx.Frame):
      def __init__(self, *args, **kw):
          wx.Frame.__init__(self, *args, **kw)
  
          sizer = wx.BoxSizer()
          button = wx.Button(self, label='Click me')
          sizer.Add(button)
          self.SetSizerAndFit(sizer)
  
          mainmenu = wx.Menu()
          next_id = 1000000
          submenus = {}
  
          for title in ['Submenu 1', 'Submenu 2', 'Submenu 3']:
              mit = wx.MenuItem(mainmenu, id=next_id, text=title)
              submenu = wx.Menu()
              mit.SetSubMenu(submenu)
              mainmenu.AppendItem(mit)
  
              next_id = next_id + 1
              submenus[title] = submenu
  
          items = [('Submenu 1', 'foo'),
                   ('Submenu 1', 'bar'),
                   ('Submenu 2', 'one'),
                   ('Submenu 2', 'two'),
                   ('Submenu 2', 'three'),
                   ('Submenu 3', 'zif'),
                   ('Submenu 3', 'zaf')]
  
          for title, item in items:
              submenu = submenus[title]
              mit = wx.MenuItem(submenu, id=next_id, text=item)
              submenu.AppendItem(mit)
              next_id = next_id + 1
  
              def callback(e, title=title, item=item):
                  print 'Item clicked: %s, %s' % (title, item)
  
              self.Bind(wx.EVT_MENU, callback, mit)
  
  
          def show(e):
              self.PopupMenu(mainmenu, button.GetPosition())
          button.Bind(wx.EVT_BUTTON, show)
  
  app = MyApp(0)
  app.MainLoop()
  </code></pre>
  
  <p>Also:</p>
  
  <pre><code>Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
  Type "help", "copyright", "credits" or "license" for more information.
  &gt;&gt;&gt; import wx
  &gt;&gt;&gt; wx.version()
  '2.8.10.1 (msw-unicode)'
  </code></pre>