On May 16, 5:04 pm, MRAB <goo...@mrabarnett.plus.com> wrote: > Seb wrote: > > On May 16, 4:20 pm, MRAB <goo...@mrabarnett.plus.com> wrote: > >> Seb wrote: > >>> I'm trying to construct a menu from an xml file. However my recursive > >>> algorithm isn't doing what I want it too. I've been starring at this > >>> for too long. Any help appreciated :) > >>> I get the following error but the problem is more of a logical nature. > >>> ./gnomeAppletMenu.py:40: GtkWarning: gtk_menu_shell_insert: assertion > >>> `GTK_IS_MENU_ITEM (child)' failed > >>> menu_bar.append(menu) > >>> I'm pretty sure I fuck up around line 27-30 > >>> xml file: > >>>http://pastie.org/480045 > >>> python code: > >>>http://pastie.org/480042 > >> The traceback suggests to me that you can add only a 'MenuItem' to a > >> 'MenuBar', but create_menu() is returning a 'Menu'. > > > Doesn't a MenuBar consists of Menu's? > > I've had a look at some examples on the web and it looks like you need > to: > > 1. Set the menu on a menu item (the 'set_submenu' method); > 2. Append the menu item onto the menu bar. > > What you're actually doing is: > > 1. Setting the menu on a menu item; > 2. Appending the menu item onto a menu; > 3. Trying to append the menu onto the menu bar. > > Result: exception. > > HTH
Ok, now it looks like below. I don't get any errors but the dictionary entry show up as a toplevel menu... damn!! def create_menu(node): menus = [] for child in node.childNodes: if child.localName == "item": menus.append(gtk.MenuItem(child.getAttribute("name"))) if child.localName == "seperator": menus.append(gtk.SeparatorMenuItem()) if child.localName == "menu": #if child.childNodes: menuitem = gtk.MenuItem(child.getAttribute("name")) menu = gtk.Menu() for mi in create_menu(child): # for each menuitem menu.append(mi) # append each menuitem to menu menuitem.set_submenu(menu) # set menu as submenu of menuitem menus.append(menuitem) return menus def factory(applet, iid): doc = minidom.parse("menu.xml") rootNode = doc.documentElement menu_bar = gtk.MenuBar() for cn in rootNode.childNodes: # for each menu under menus for menu in create_menu(cn): # for each menu in list menu_bar.append(menu) # append each menu applet.add(menu_bar) applet.show_all() return True -- http://mail.python.org/mailman/listinfo/python-list