X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ba2b238e5dd4c270dd2c1e4dd6168f402a0a4e64..dae0faa6be08c5bb5635fd464b695ac8bb8f2b8d:/wxPython/demo/wxMenu.py diff --git a/wxPython/demo/wxMenu.py b/wxPython/demo/wxMenu.py index c373fa43de..516241efcf 100644 --- a/wxPython/demo/wxMenu.py +++ b/wxPython/demo/wxMenu.py @@ -4,40 +4,52 @@ # menus in wxPython 2.3.3 # #------------------------------------------------------------------- +# 11/20/2003 - Jeff Grimmett (grimmtooth@softhome.net) +# +# o Updated for wx namespace +# -from wxPython.wx import * +import time +import wx +import images #------------------------------------------------------------------- -class MyFrame(wxFrame): +class MyFrame(wx.Frame): def __init__(self, parent, id, log): - wxFrame.__init__(self, parent, id, 'Playing with menus', size=(400, 200)) + wx.Frame.__init__(self, parent, id, 'Playing with menus', size=(400, 200)) self.log = log self.CenterOnScreen() self.CreateStatusBar() self.SetStatusText("This is the statusbar") + tc = wx.TextCtrl(self, -1, """ +A bunch of bogus menus have been created for this frame. You +can play around with them to see how they behave and then +check the source for this sample to see how to implement them. +""", style=wx.TE_READONLY|wx.TE_MULTILINE) + # Prepare the menu bar - menuBar = wxMenuBar() + menuBar = wx.MenuBar() # 1st menu from left - menu1 = wxMenu() - menu1.Append(101, "Mercury", "This the text in the Statusbar") - menu1.Append(102, "Venus", "") - menu1.Append(103, "Earth", "You may select Earth too") + menu1 = wx.Menu() + menu1.Append(101, "&Mercury", "This the text in the Statusbar") + menu1.Append(102, "&Venus", "") + menu1.Append(103, "&Earth", "You may select Earth too") menu1.AppendSeparator() - menu1.Append(104, "Exit", "Close this frame") + menu1.Append(104, "&Close", "Close this frame") # Add menu to the menu bar menuBar.Append(menu1, "&Planets") # 2nd menu from left - menu2 = wxMenu() + menu2 = wx.Menu() menu2.Append(201, "Hydrogen") menu2.Append(202, "Helium") # a submenu in the 2nd menu - submenu = wxMenu() + submenu = wx.Menu() submenu.Append(2031,"Lanthanium") submenu.Append(2032,"Cerium") submenu.Append(2033,"Praseodymium") @@ -45,54 +57,92 @@ class MyFrame(wxFrame): # Append 2nd menu menuBar.Append(menu2, "&Elements") - menu3 = wxMenu() - menu3.Append(301, "IDLE", "a Python shell using tcl/tk as GUI", wxITEM_RADIO) - menu3.Append(302, "PyCrust", "a Python shell using wxPython as GUI", wxITEM_RADIO) - menu3.Append(303, "psi", "a simple Python shell using wxPython as GUI", wxITEM_RADIO) + menu3 = wx.Menu() + # Radio items + menu3.Append(301, "IDLE", "a Python shell using tcl/tk as GUI", wx.ITEM_RADIO) + menu3.Append(302, "PyCrust", "a Python shell using wxPython as GUI", wx.ITEM_RADIO) + menu3.Append(303, "psi", "a simple Python shell using wxPython as GUI", wx.ITEM_RADIO) menu3.AppendSeparator() - menu3.Append(304, "project1", "", wxITEM_NORMAL) - menu3.Append(305, "project2", "", wxITEM_NORMAL) + menu3.Append(304, "project1", "", wx.ITEM_NORMAL) + menu3.Append(305, "project2", "", wx.ITEM_NORMAL) menuBar.Append(menu3, "&Shells") - menu4 = wxMenu() - menu4.Append(401, "letters", "abcde...", wxITEM_CHECK) - menu4.Append(402, "digits", "123...", wxITEM_CHECK) - menu4.Append(403, "letters and digits", "abcd... + 123...", wxITEM_CHECK) + menu4 = wx.Menu() + # Check menu items + menu4.Append(401, "letters", "abcde...", wx.ITEM_CHECK) + menu4.Append(402, "digits", "123...", wx.ITEM_CHECK) + menu4.Append(403, "letters and digits", "abcd... + 123...", wx.ITEM_CHECK) menuBar.Append(menu4, "Chec&k") - menu5 = wxMenu() - menu5.Append(501, "Interesting thing\tCtrl+A", "Note the shortcut!") + menu5 = wx.Menu() + # Show how to put an icon in the menu + item = wx.MenuItem(menu5, 500, "&Smile!\tCtrl+S", "This one has an icon") + item.SetBitmap(images.getSmilesBitmap()) + menu5.AppendItem(item) + # Shortcuts + menu5.Append(501, "Interesting thing\tCtrl+A", "Note the shortcut!") menu5.AppendSeparator() menu5.Append(502, "Hello\tShift+H") + menu5.AppendSeparator() + menu5.Append(503, "remove the submenu") + menu6 = wx.Menu() + menu6.Append(601, "Submenu Item") + menu5.AppendMenu(504, "submenu", menu6) + menu5.Append(505, "remove this menu") + menu5.Append(506, "this is updated") + menu5.Append(507, "insert after this...") + menu5.Append(508, "...and before this") menuBar.Append(menu5, "&Fun") self.SetMenuBar(menuBar) # Menu events - EVT_MENU(self, 101, self.Menu101) - EVT_MENU(self, 102, self.Menu102) - EVT_MENU(self, 103, self.Menu103) - EVT_MENU(self, 104, self.CloseWindow) - - EVT_MENU(self, 201, self.Menu201) - EVT_MENU(self, 202, self.Menu202) - EVT_MENU(self, 2031, self.Menu2031) - EVT_MENU(self, 2032, self.Menu2032) - EVT_MENU(self, 2033, self.Menu2033) + self.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight) + + self.Bind(wx.EVT_MENU, self.Menu101, id=101) + self.Bind(wx.EVT_MENU, self.Menu102, id=102) + self.Bind(wx.EVT_MENU, self.Menu103, id=103) + self.Bind(wx.EVT_MENU, self.CloseWindow, id=104) + + self.Bind(wx.EVT_MENU, self.Menu201, id=201) + self.Bind(wx.EVT_MENU, self.Menu202, id=202) + self.Bind(wx.EVT_MENU, self.Menu2031, id=2031) + self.Bind(wx.EVT_MENU, self.Menu2032, id=2032) + self.Bind(wx.EVT_MENU, self.Menu2033, id=2033) + + self.Bind(wx.EVT_MENU, self.Menu301To303, id=301) + self.Bind(wx.EVT_MENU, self.Menu301To303, id=302) + self.Bind(wx.EVT_MENU, self.Menu301To303, id=303) + self.Bind(wx.EVT_MENU, self.Menu304, id=304) + self.Bind(wx.EVT_MENU, self.Menu305, id=305) + + # Range of menu items + self.Bind(wx.EVT_MENU_RANGE, self.Menu401To403, id=401, id2=403) + + self.Bind(wx.EVT_MENU, self.Menu500, id=500) + self.Bind(wx.EVT_MENU, self.Menu501, id=501) + self.Bind(wx.EVT_MENU, self.Menu502, id=502) + self.Bind(wx.EVT_MENU, self.TestRemove, id=503) + self.Bind(wx.EVT_MENU, self.TestRemove2, id=505) + self.Bind(wx.EVT_MENU, self.TestInsert, id=507) + self.Bind(wx.EVT_MENU, self.TestInsert, id=508) + + wx.GetApp().Bind(wx.EVT_UPDATE_UI, self.TestUpdateUI, id=506) - EVT_MENU(self, 301, self.Menu301To303) - EVT_MENU(self, 302, self.Menu301To303) - EVT_MENU(self, 303, self.Menu301To303) - EVT_MENU(self, 304, self.Menu304) - EVT_MENU(self, 305, self.Menu305) + # Methods - EVT_MENU_RANGE(self, 401, 403, self.Menu401To403) + def OnMenuHighlight(self, event): + # Show how to get menu item imfo from this event handler + id = event.GetMenuId() + item = self.GetMenuBar().FindItemById(id) + text = item.GetText() + help = item.GetHelp() - EVT_MENU(self, 501, self.Menu501) - EVT_MENU(self, 502, self.Menu502) + #print text, help + # but in this case just call Skip so the default is done + event.Skip() - # Methods def Menu101(self, event): self.log.write('Welcome to Mercury\n') @@ -134,18 +184,79 @@ class MyFrame(wxFrame): def Menu401To403(self, event): self.log.write('From a EVT_MENU_RANGE event\n') + def Menu500(self, event): + self.log.write('Have a happy day!\n') + def Menu501(self, event): self.log.write('Look in the code how the shortcut has been realized\n') def Menu502(self, event): self.log.write('Hello from Jean-Michel\n') + + def TestRemove(self, evt): + mb = self.GetMenuBar() + submenuItem = mb.FindItemById(601) + + if not submenuItem: + return + + submenu = submenuItem.GetMenu() + menu = submenu.GetParent() + + # This works + #menu.Remove(504) + + # this also works + menu.RemoveItem(mb.FindItemById(504)) + + # This doesn't work, as expected since submenuItem is not on menu + #menu.RemoveItem(submenuItem) + + + def TestRemove2(self, evt): + mb = self.GetMenuBar() + mb.Remove(4) + + + def TestUpdateUI(self, evt): + text = time.ctime() + evt.SetText(text) + + + def TestInsert(self, evt): + theID = 508 + # get the menu + mb = self.GetMenuBar() + menuItem = mb.FindItemById(theID) + menu = menuItem.GetMenu() + + # figure out the position to insert at + pos = 0 + + for i in menu.GetMenuItems(): + if i.GetId() == theID: + break + + pos += 1 + + # now insert the new item + ID = wx.NewId() + ##menu.Insert(pos, ID, "NewItem " + str(ID)) + item = wx.MenuItem(menu) + item.SetId(ID) + item.SetText("NewItem " + str(ID)) + menu.InsertItem(pos, item) + + #------------------------------------------------------------------- +wx.RegisterId(10000) + def runTest(frame, nb, log): win = MyFrame(frame, -1, log) frame.otherWin = win - win.Show(true) + win.Show(True) #------------------------------------------------------------------- @@ -153,9 +264,33 @@ def runTest(frame, nb, log): overview = """\ A demo of using wxMenuBar and wxMenu in various ways. -""" +A menu is a popup (or pull down) list of items, one of which may be selected +before the menu goes away (clicking elsewhere dismisses the menu). Menus may be +used to construct either menu bars or popup menus. + +A menu item has an integer ID associated with it which can be used to identify +the selection, or to change the menu item in some way. A menu item with a special +identifier -1 is a separator item and doesn't have an associated command but just +makes a separator line appear in the menu. + +Menu items may be either normal items, check items or radio items. Normal items +don't have any special properties while the check items have a boolean flag associated +to them and they show a checkmark in the menu when the flag is set. wxWindows +automatically toggles the flag value when the item is clicked and its value may +be retrieved using either IsChecked method of wxMenu or wxMenuBar itself or by +using wxEvent.IsChecked when you get the menu notification for the item in question. + +The radio items are similar to the check items except that all the other items +in the same radio group are unchecked when a radio item is checked. The radio group +is formed by a contiguous range of radio items, i.e. it starts at the first item of +this kind and ends with the first item of a different kind (or the end of the menu). +Notice that because the radio groups are defined in terms of the item positions +inserting or removing the items in the menu containing the radio items risks to not +work correctly. Finally note that the radio items are only supported under Windows +and GTK+ currently. +""" if __name__ == '__main__':