11.4. Ejemplo de Factoria de Elementos

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   # example itemfactory.py
    4   
    5   import gtk
    6   
    7	class ItemFactoryExample:
    8	    # Obligatory basic callback
    9	    def print_hello(self, w, data):
   10	        print "Hello, World!"
   11	
   12	    # Esta es la estructura de la Factoria de Elementos usada para generar nuevos menús
   13	    # Item 1: La ruta del menú. La letra después del subrayado indica
   14	    #         una tecla de atajo cuando el menú se abra
   15	    # Item 2: La tecla de atajo para el elemento
   16	    # Item 3: La retrollamada
   17	    # Item 4: La acción de retrollamada. Esto cambia los parámetros con
   18	    #         los que la retrollamada se llama. El valor predeterminado es 0
   19	    # Item 5: El tipo de elemento, usado para definir el tipo al que pertenece el elemento
   20	    #       Aqui están los posibles valores
   21	
   22	    #       NULL               -> "<Item>"
   23	    #       ""                 -> "<Item>"
   24	    #       "<Title>"          -> título
   25	    #       "<Item>"           -> simple
   26	    #       "<CheckItem>"      -> activación
   27	    #       "<ToggleItem>"     -> biestado
   28	    #       "<RadioItem>"      -> exclusión mútua
   29	    #       <path>             -> ruta de un elemento de exclusión mútua
   30	    #       "<Separator>"      -> separador
   31	    #       "<Branch>"         -> contenedor de nuevos elementos
   32	    #       "<LastBranch>"     -> rama justificada a la derecha
   33	
   34	    def get_main_menu(self, window):
   35	        accel_group = gtk.AccelGroup()
   36	
   37	        # This function initializes the item factory.
   38	        # Param 1: The type of menu - can be MenuBar, Menu,
   39	        #          or OptionMenu.
   40	        # Param 2: The path of the menu.
   41	        # Param 3: A reference to an AccelGroup. The item factory sets up
   42	        #          the accelerator table while generating menus.
   43	        item_factory = gtk.ItemFactory(gtk.MenuBar, "<main>", accel_group)
   44	
   45	        # This method generates the menu items. Pass to the item factory
   46	        #  the list of menu items
   47	        item_factory.create_items(self.menu_items)
   48	
   49	        # Attach the new accelerator group to the window.
   50	        window.add_accel_group(accel_group)
   51	
   52	        # need to keep a reference to item_factory to prevent its destruction
   53	        self.item_factory = item_factory
   54	        # Finally, return the actual menu bar created by the item factory.
   55	        return item_factory.get_widget("<main>")
   56	
   57	    def __init__(self):
   58	        self.menu_items = (
   59	            ( "/_File",         None,         None, 0, "<Branch>" ),
   60	            ( "/File/_New",     "<control>N", self.print_hello, 0, None ),
   61	            ( "/File/_Open",    "<control>O", self.print_hello, 0, None ),
   62	            ( "/File/_Save",    "<control>S", self.print_hello, 0, None ),
   63	            ( "/File/Save _As", None,         None, 0, None ),
   64	            ( "/File/sep1",     None,         None, 0, "<Separator>" ),
   65	            ( "/File/Quit",     "<control>Q", gtk.mainquit, 0, None ),
   66	            ( "/_Options",      None,         None, 0, "<Branch>" ),
   67	            ( "/Options/Test",  None,         None, 0, None ),
   68	            ( "/_Help",         None,         None, 0, "<LastBranch>" ),
   69	            ( "/_Help/About",   None,         None, 0, None ),
   70	            )
   71	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   72	        window.connect("destroy", gtk.mainquit, "WM destroy")
   73	        window.set_title("Item Factory")
   74	        window.set_size_request(300, 200)
   75	
   76	        main_vbox = gtk.VBox(gtk.FALSE, 1)
   77	        main_vbox.set_border_width(1)
   78	        window.add(main_vbox)
   79	        main_vbox.show()
   80	
   81	        menubar = self.get_main_menu(window)
   82	
   83	        main_vbox.pack_start(menubar, gtk.FALSE, gtk.TRUE, 0)
   84	        menubar.show()
   85	        window.show()
   86	
   87	def main():
   88	    gtk.main()
   89	    return 0
   90	
   91	if __name__ == "__main__":
   92	    ItemFactoryExample()
   93	    main()

Por ahora esto es sólo un ejemplo. Una explicación y muchos comentarios vendrán después.