2010-03-23 1 views
1

Моя цель: пользователь нажимает кнопку. С помощью кнопки открывается двухуровневое меню. Пользователь нажимает на что-то, и это вызывает обратный вызов, который делает вещи.WxPython, всплывающие меню, обратные вызовы и Windows XP

Вот минимальный пример:

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() 

также:

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. 
>>> import wx 
>>> wx.version() 
'2.8.10.1 (msw-unicode)' 

ответ

2

Вы регулируете поколение ID себя, и при этом, что смешение идентификаторов, в любом случае вам не нужно генерировать идентификаторы самостоятельно использовать wx.NewId(), если вы замените next_id тем, что он будет работать например

mit = wx.MenuItem(submenu, id=wx.NewId(), text=item) 
+0

Как легко. Да. Мне не нравится обрабатывать собственное удостоверение личности, но я пришел к выводу, что мне нужно для пунктов меню (я не помню, почему ..). В остальном я опускаю параметр id =. Я не знал о wx.NextId(). –

+0

А, я помню. Это потому, что MenuItem с идентификатором -1 является разделителем. –

Смежные вопросы