Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] pygtk desactivar item de un menu

Estas en el tema de pygtk desactivar item de un menu en el foro de Python en Foros del Web. Buenas, estoy dando mis primeros pasos con pyGtk Me interesa conseguir que según el estado de trabajo, ciertos elementos del menú sean accesibles o no. ...
  #1 (permalink)  
Antiguo 27/06/2013, 12:37
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
pygtk desactivar item de un menu

Buenas, estoy dando mis primeros pasos con pyGtk

Me interesa conseguir que según el estado de trabajo, ciertos elementos del menú sean accesibles o no. Por ejemplo, si no hay documento abierto, que la opción 'cerrar documento' aparezca deshabilitada.

Con un botón, Gtk.Button, el método set_sensitive(False) funciona correctamente, el botón adquiere una apariencia de deshabilitado y no emite la señal al hacer click. Pero con los Gtk.MenuItem, el método funciona a nivel gráfico (apariencia de estar inaccesible), sin embargo, sigue emitiendo la señal.
  #2 (permalink)  
Antiguo 27/06/2013, 14:10
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: pygtk desactivar item de un menu

A mi si me funciona bien.

Código Python:
Ver original
  1. import gtk
  2.  
  3.  
  4. class PyApp(gtk.Window):
  5.  
  6.     def __init__(self):
  7.         super(PyApp, self).__init__()
  8.  
  9.         self.set_title("Simple menu")
  10.         self.set_size_request(250, 200)
  11.         self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
  12.         self.set_position(gtk.WIN_POS_CENTER)
  13.  
  14.         mb = gtk.MenuBar()
  15.  
  16.         filemenu = gtk.Menu()
  17.         filem = gtk.MenuItem("File")
  18.         filem.set_submenu(filemenu)
  19.  
  20.         save = gtk.MenuItem("Save")
  21.         exit = gtk.MenuItem("Exit")
  22.        
  23.         exit.connect("activate", gtk.main_quit)
  24.         save.connect("activate", self.on_save)
  25.  
  26.         gtk.Widget.set_sensitive(save, False)
  27.        
  28.         filemenu.append(save)
  29.         filemenu.append(exit)
  30.  
  31.         mb.append(filem)
  32.  
  33.         vbox = gtk.VBox(False, 2)
  34.         vbox.pack_start(mb, False, False, 0)
  35.  
  36.         self.add(vbox)
  37.  
  38.         self.connect("destroy", gtk.main_quit)
  39.         self.show_all()
  40.  
  41.     def on_save(self, event=None):
  42.         print "Click save"
  43.        
  44.        
  45. PyApp()
  46. gtk.main()

Fuente del código base: http://zetcode.com/gui/pygtk/menus/
  #3 (permalink)  
Antiguo 28/06/2013, 05:54
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Respuesta: pygtk desactivar item de un menu

Cierto, si creo una variable del tipo gtk.MenuItem funciona, mi problema estaba que pretendo hacer menús dinámicos en tiempo de ejecución, según plugin instalados, así que hice pruebas definiendo el menú tal que así:
Código Python:
Ver original
  1. ...
  2.          self.menu_archivo = gtk.Menu()
  3.          self.m_items = (("Nuevo", self.nuevo_doc),\
  4.                 ("Abrir", self.abrir_doc),\
  5.                 ("Guardar", self.guardar_doc),\
  6.                 ("Guardar como", self.guardar_como_doc),\
  7.                 ("Cerrar Documento", self.cerrar_doc),\
  8.                 ("Cerrar Todos", self.cerrar_all),\
  9.                 ("Salir", self.salir))
  10.         for etiqueta, funcion in self.m_items:
  11.             m_item = gtk.MenuItem(etiqueta)
  12.             self.menu_archivo.append(m_item)
  13.             m_item.connect("activate", funcion)
  14.             m_item.show()
  15.         self.mm = gtk.MenuItem("OTRO")
  16.         self.menu_archivo.append(self.mm)
  17.         self.mm.connect("activate", self.holamm)
  18.         self.mm.show()...

En la función holamm...
Código Python:
Ver original
  1. def holamm(self, widget):
  2.         if self.mm.get_sensitive():
  3.             self.mm.set_sensitive(False)
  4.         else:
  5.             self.mm.set_sensitive(True)
... la instrucción del else nunca se ejecuta, porque set_sensitive funciona perfectamente.
Sin embargo, en la función
Código Python:
Ver original
  1. def nuevo_doc(self, widget):
  2.         print "Nuevo"
  3.         for item in self.menu_archivo:
  4.             menu = item.get_child()
  5.  
  6.             if menu.get_text() == "Nuevo":
  7.                 if menu.get_sensitive():
  8.                     menu.set_sensitive(False)
  9.                 else:
  10.                     menu.set_sensitive(True)
... se alterna el color del texto.

Me he dado cuenta que el problema está en que item.get_child() devuelve un gtk.Accel... , e item es el gtk.Menuitem (que no tiene get_text)

Última edición por maestrodenada; 28/06/2013 a las 06:01
  #4 (permalink)  
Antiguo 28/06/2013, 09:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: pygtk desactivar item de un menu

Te recomiendo que si tienes dudas de los métodos leas un poco la documentación.

http://www.pygtk.org/docs/pygtk/class-gtkmenuitem.html


Código Python:
Ver original
  1. def nuevo_doc(self, widget):
  2.         print "Nuevo"
  3.         for item in self.menu_archivo:
  4.             if item.get_label() == "Nuevo":
  5.                 if item.get_sensitive():
  6.                     item.set_sensitive(False)
  7.                 else:
  8.                     item.set_sensitive(True)

Etiquetas: desactivar, item, pygtk
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:58.