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