Popupmenu con pygtk

Rafael Villar Burke pachi en mmn-arquitectos.com
Lun Feb 21 13:24:29 CET 2005


Jordi Ivars wrote:

>Hola a todos.
>
>El otro dia pregunté acerca de añadir iconos a unos menus que habia
>hecho y parece ser que estaba usando un método obsoleto para menus, asi
>que me he puesto manos a la obra para intentar reproducir el menu popup
>que tenia hecho. Basicamente hago lo siguiente:
>
>ui_string = """<ui>
>		<popup name='Popup'>
>	    <menuitem action='New'/>
>        <menuitem action='Open'/>
>		</popup>
>		</ui>"""
>
>ag = gtk.ActionGroup('WindowActions')
>		actions = [
>	    ('New',      gtk.STOCK_NEW, '_New', '<control>N', 'Create a new
>file', self.menu_response),
>        ('Open',     gtk.STOCK_OPEN, '_Open', '<control>O', 'Open a
>file', self.menu_response),
>		]
>
>ag.add_actions(actions)
>self.ui = gtk.UIManager(gtk.UI_MANAGER_POPUP)
>self.ui.insert_action_group(ag, 0)
>self.ui.add_ui_from_string(ui_string)
>widget = self.ui.get_widget("/Popup")
>
>Hasta aqui supongo que el menu está correctamente construido, me parece
>a mi. Solo que aun tengo que mostrarlo. Intento hacerlo con una vbox,
>asi:
>
>vbox = gtk.VBox()
>vbox.pack_start(widget,expand=True)
>self.vbox1.add(vbox)
>vbox.show()
>
>self.vbox1 es la caja principal donde va alojado el popupmenu. He ido
>combinando distintas posibilidades, pero nada. Si añador un print
>widget.get_name() veo que me imprime el nombre correcto (Popup) y lo
>hace cada vez que le doy al boton del ratón, con lo que al menu si
>llega, pero no lo dibuja. En algunos casos (en el que pongo de ejemplo)
>me da un error, que es:
>
>menus.py:279: GtkWarning: gtk_box_pack_start: assertion `child->parent
>== NULL' failed
>  vbox.pack_start(widgets,expand=True)
>
>Pero me sigo perdiendo igual, me parece que debo estar cerca, pero
>bueno, que no lo cojo y no hay muchos ejemplos de uimanager por google
>que me valgan.
>
>En fin, espero que a alguien le suene todo esto:). Muchísimas gracias
>por vuestra atención y saludos.
>
>Jordi Ivars
>  
>
Piensa que UIManager es la nueva manera de crear los menús y barras de 
herramientas, pero se crea el mismo tipo de controles que antes. Aquí lo 
que tendrías que usar el es método "popup" de gtk.Menu ( 
http://pygtk.org/pygtk2reference/class-gtkmenu.html#method-gtkmenu--popup )

Y un ejemplo rápido que funciona con parte de tu código:

import pygtk
pygtk.require('2.0')
import gtk

def menu_response(uno, dos):
    pass

def on_button_clicked(button, widget):
    widget.popup(None, None, None, 0, 0)

ui_string = """<ui>
            <popup name='Popup'>
                <menuitem action='New'/>
                <menuitem action='Open'/>
            </popup>
            </ui>"""

ag = gtk.ActionGroup('WindowActions')
actions = [('New', gtk.STOCK_NEW, '_New', '<control>N',
            'Create a new file', menu_response),
           ('Open', gtk.STOCK_OPEN, '_Open', '<control>O',
            'Open a file', menu_response),]

ag.add_actions(actions)
ui = gtk.UIManager(gtk.UI_MANAGER_POPUP)
ui.insert_action_group(ag, 0)
ui.add_ui_from_string(ui_string)
widget = ui.get_widget("/Popup")

win = gtk.Window()
win.connect('delete-event', gtk.main_quit)
button = gtk.Button(u"Pulsa aqui")
button.connect("clicked", on_button_clicked, widget)
win.add(button)
win.show_all()
gtk.main()

--
Pachi
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es