11.4. Ejemplo de Factoria de Elementos - ItemFactory

El programa de ejemplo itemfactory.py usa la gtk.ItemFactory. La figura Figura 11.2, “Ejemplo de Factoria de Elementos” muestra la ventana del programa:

Figura 11.2. Ejemplo de Factoria de Elementos

Ejemplo de Factoria de Elementos

El código fuente de itemfactory.py es:

    1   #!/usr/bin/env python
    2   
    3   # ejemplo itemfactory.py
    4   
    5   import gtk
    6	pygtk.require('2.0')
    7	import gtk
    8   
    9	class ItemFactoryExample:
   10	    # Retrollamada básica obligatoria
   11	    def print_hello(self, w, data):
   12	        print "Hello, World!"
   13	
   14	    # Esta es la estructura de la Factoria de Elementos usada para generar nuevos menús
   15	    # Item 1: La ruta del menú. La letra después del subrayado indica
   16	    #         una tecla de atajo cuando el menú se abra
   17	    # Item 2: La tecla de atajo para el elemento
   18	    # Item 3: La retrollamada
   19	    # Item 4: La acción de retrollamada. Esto cambia los parámetros con
   20	    #         los que la retrollamada es llamada. El valor predeterminado es 0
   21	    # Item 5: El tipo de elemento, usado para definir el tipo al que pertenece el elemento
   22	    #       Aqui están los posibles valores
   23	
   24	    #       NULL               -> "<Item>"
   25	    #       ""                 -> "<Item>"
   26	    #       "<Title>"          -> crear un elemento de título
   27	    #       "<Item>"           -> crear un elemento simple
   28	    #       "<CheckItem>"      -> crear un elemento de activación
   29	    #       "<ToggleItem>"     -> crear un botón biestado
   30	    #       "<RadioItem>"      -> crear un botón de exclusión mútua
   31	    #       <path>             -> ruta de un elemento de exclusión mútua
   32	    #       "<Separator>"      -> crear un separador
   33	    #       "<Branch>"         -> crear un contenedor de nuevos elementos
   34	    #       "<LastBranch>"     -> crear una rama justificada a la derecha
   35	
   36	    def get_main_menu(self, window):
   37	        accel_group = gtk.AccelGroup()
   38	
   39	        # Esta función inicializa la factoría de elementos.
   40	        # Param 1: El tipo del menú - puede ser MenuBar, Menu,
   41	        #          u OptionMenu.
   42	        # Param 2: La ruta o camino del menú.
   43	        # Param 3: Una referencia a un AccelGroup. La factoria de elementos establece la
   44	        #          tabla de aceleradores (atajos) al generar los menús.
   45	        item_factory = gtk.ItemFactory(gtk.MenuBar, "<main>", accel_group)
   46	
   47	        # Este método genera los elementos de menú. Pasa a la factoría de elementos la lista
   48	        #  de los elementos de menú
   49	        item_factory.create_items(self.menu_items)
   50	
   51	        # Añadir el nuevo grupo de aceleradores a la ventana.
   52	        window.add_accel_group(accel_group)
   53	
   54	        # es necesario mantener una referencia a item_factory para evitar su destrucción
   55	        self.item_factory = item_factory
   56	        # Finalmente, se devuelve la barra de menú creada por la factoría de elementos.
   57	        return item_factory.get_widget("<main>")
   58	
   59	    def __init__(self):
   60	        self.menu_items = (
   61	            ( "/_File",         None,         None, 0, "<Branch>" ),
   62	            ( "/File/_New",     "<control>N", self.print_hello, 0, None ),
   63	            ( "/File/_Open",    "<control>O", self.print_hello, 0, None ),
   64	            ( "/File/_Save",    "<control>S", self.print_hello, 0, None ),
   65	            ( "/File/Save _As", None,         None, 0, None ),
   66	            ( "/File/sep1",     None,         None, 0, "<Separator>" ),
   67	            ( "/File/Quit",     "<control>Q", gtk.mainquit, 0, None ),
   68	            ( "/_Options",      None,         None, 0, "<Branch>" ),
   69	            ( "/Options/Test",  None,         None, 0, None ),
   70	            ( "/_Help",         None,         None, 0, "<LastBranch>" ),
   71	            ( "/_Help/About",   None,         None, 0, None ),
   72	            )
   73	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   74	        window.connect("destroy", gtk.mainquit, "WM destroy")
   75	        window.set_title("Item Factory")
   76	        window.set_size_request(300, 200)
   77	
   78	        main_vbox = gtk.VBox(gtk.FALSE, 1)
   79	        main_vbox.set_border_width(1)
   80	        window.add(main_vbox)
   81	        main_vbox.show()
   82	
   83	        menubar = self.get_main_menu(window)
   84	
   85	        main_vbox.pack_start(menubar, gtk.FALSE, gtk.TRUE, 0)
   86	        menubar.show()
   87	        window.show()
   88	
   89	def main():
   90	    gtk.main()
   91	    return 0
   92	
   93	if __name__ == "__main__":
   94	    ItemFactoryExample()
   95	    main()

Por ahora esto es sólo un ejemplo. Más adelante aparecerá una explicación y muchos comentarios.