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

Reply via email to