代码之家  ›  专栏  ›  技术社区  ›  John Fouhy

wxpython、弹出菜单、回调和Windows XP

  •  1
  • John Fouhy  · 技术社区  · 15 年前

    我的目标:用户点击一个按钮。从按钮弹出两级菜单。用户点击某个东西,这会触发一个回调。

    下面是一个最小的例子:

    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)'
    
    1 回复  |  直到 15 年前
        1
  •  2
  •   Anurag Uniyal    15 年前

    您自己处理ID生成,并且在混合ID时,无论如何,您不需要自己生成使用的ID。 wx.NewId() ,如果用它替换下一个ID,它将工作。 例如

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