PyGTK - MenuBar, Menu y MenuItem
Una barra horizontal justo debajo de la barra de título de un gtk de nivel superior. La ventana está reservada para mostrar una serie de menús. Es un objeto de la clase gtk.MenuBar en la API PyGTK.
Se agrega un objeto de la clase gtk.Menu a la barra de menú. También se utiliza para crear un menú contextual y un menú emergente. Cada menú puede contener uno o más widgets gtk.MenuItem. Algunos de ellos pueden ser un submenú y tener botones MenuItem en cascada.
El gtk.MenuBar está subclasificado de la clase gtk.MenuShell. Tiene un constructor predeterminado simple:
gtk.MenuBar()
Para agregar un menú a MenuBar, se usa el método append () de la clase MenuBar.
Para construir un menú, cree un widget MenuItem con una etiqueta que desee que aparezca en la barra de menú y configúrelo como submenú.
Por ejemplo, el siguiente código se usa para configurar un menú Archivo:
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
Ahora, se pueden agregar uno o más widgets de la clase MenuItem en el menú.
item1 = gtk.MenuItem("New")
item2 = gtk.MenuItem("Open")
Estos elementos de menú se agregan al widget de menú y el objeto de menú a su vez se agrega a la barra de menú.
menu1.append(item1)
menu1.append(item2)
mb.append(menu1)
El kit de herramientas de PyGTK ofrece muchos tipos de widgets de MenuItem. Un ImageMenuItem es un elemento de menú con una imagen asociada. Puede utilizar cualquiera de las imágenes de stock mediante el parámetro Stock ID o asignar cualquier otra imagen mediante el método set_image ().
Por ejemplo, el elemento de menú 'Nuevo' que tiene una imagen se crea de la siguiente manera:
new = gtk.ImageMenuItem(gtk.STOCK_NEW)
menu1.append(new)
Del mismo modo, también es posible agregar CheckMenuItem usando el siguiente código:
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
También se puede agregar un grupo de elementos de radio usando este código:
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
A veces, es posible que desee agregar una línea de separación entre los elementos del menú. Para ello, elSeparatorMenuItem también está disponible.
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
También puede asignar atajos de teclado a los elementos del menú. PyGTK tiene aceleradores. Comience creando un grupo de aceleradores y adjúntelo a la ventana de nivel superior.
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
Para asignar un atajo, use add_accelerator() funcionar con el siguiente prototipo -
Item1.add_accelerator(signal, group, key, modifier, flags)
Los siguientes son algunos de los modificadores predefinidos:
- SHIFT_MASK
- LOCK_MASK
- CONTROL_MASK
- BUTTON1_MASK
- BUTTON1_MASK
Para asignar el atajo Ctrl + N al elemento de menú nuevo, use la siguiente sintaxis:
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
Ejemplo
El siguiente ejemplo demuestra las características discutidas anteriormente:
import gtk
class PyApp(gtk.Window):
def __init__(self):
super(PyApp, self).__init__()
self.set_title("Menu Demo")
self.set_default_size(250, 200)
self.set_position(gtk.WIN_POS_CENTER)
mb = gtk.MenuBar()
menu1 = gtk.Menu()
file = gtk.MenuItem("_File")
file.set_submenu(menu1)
acgroup = gtk.AccelGroup()
self.add_accel_group(acgroup)
new = gtk.ImageMenuItem(gtk.STOCK_NEW,acgroup)
new.add_accelerator("activate", acgroup, ord('N'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
menu1.append(new)
open = gtk.ImageMenuItem(gtk.STOCK_OPEN)
menu1.append(open)
chk = gtk.CheckMenuItem("Checkable")
menu1.append(chk)
radio1 = gtk.RadioMenuItem(None,"Radio1")
radio2 = gtk.RadioMenuItem(radio1, "Radio2")
menu1.append(radio1)
menu1.append(radio2)
sep = gtk.SeparatorMenuItem()
menu1.append(sep)
exit = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menu1.append(exit)
menu2 = gtk.Menu()
edit = gtk.MenuItem("_Edit")
edit.set_submenu(menu2)
copy = gtk.ImageMenuItem(gtk.STOCK_COPY)
menu2.append(copy)
cut = gtk.ImageMenuItem(gtk.STOCK_CUT)
menu2.append(cut)
paste = gtk.ImageMenuItem(gtk.STOCK_PASTE)
menu2.append(paste)
mb.append(file)
mb.append(edit)
vbox = gtk.VBox(False, 2)
vbox.pack_start(mb, False, False, 0)
self.add(vbox)
self.connect("destroy", gtk.main_quit)
self.show_all()
if __name__ == '__main__':
PyApp()
gtk.main()
El código anterior producirá el siguiente resultado: