La Figure 11.2 montre la fenetre créée par le programme d'exemple itemfactory.py, qui utilise la gtk.ItemFactory :
Voici le code source de itemfactory.py :
1 #!/usr/bin/env python 2 3 # exemple itemfactory.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 class ExempleItemFactory: 10 # L'inevitable petite fonction de rappel 11 def affiche_hello(self, w, donnees): 12 print "Salut tout le monde !" 13 14 # Voici la structure d'ItemFactoryEntry utilisee pour generer de nouveaux menus 15 # Element 1: Le chemin du menu. la lettre qui suit le caractere "_" indique un 16 # raccourci clavier actif une fois le menu ouvert. 17 # Element 2: Le raccourci clavier pour cette entree. 18 # Element 3: La fonction de rappel. 19 # Element 4: L'action de la fonction de rappel. Modifie les parametres avec 20 # lesquels la fonction de rappel est appelee. 0 par defaut. 21 # Element 5: Le type d'entree. Indique quelle sorte d'entree l'on souhaite creer. 22 # Voici les differentes valeurs possibles : 23 24 # NULL -> "- " 25 # "" -> "
- " 26 # "
" -> cree une entree titre 27 # " - " -> cree une entree simple 28 # "
" -> cree une entree a cocher 29 # " " -> cree une entree a bascule 30 # " " -> cree une entree radio 31 # -> chemin d'une entree radio a laquelle attacher celle-ci 32 # " " -> cree un separateur 33 # " " -> cree une entree pouvant contenir des sous-entrees (optionel) 34 # " " -> cree une entree "Branch" alignee a droite 35 36 def menu_principal(self, fenetre): 37 racc_clavier = gtk.AccelGroup() 38 39 # Cette fonction initialise l'ItemFactory. 40 # Param 1: Le type de menu - peut etre MenuBar, Menu, 41 # ou OptionMenu. 42 # Param 2: Le chemin du menu. 43 # Param 3: une reference a un AccelGroup. L'ItemFactory configure 44 # la table des raccourcis en generant les menus. 45 item_factory = gtk.ItemFactory(gtk.MenuBar, " ", racc_clavier) 46 47 # Cette methode genere les entrees du menu. On transmet a l'ItemFactory 48 # la liste des entrees de menu. 49 item_factory.create_items(self.entrees_menu) 50 51 # On attache le nouveau groupe de raccourcis clavier a la fenetre. 52 fenetre.add_accel_group(racc_clavier) 53 54 # On a besoin de garder une reference a item_factory pour empecher sa destruction 55 self.item_factory = item_factory 56 # Enfin, on renvoie la barre de menus creee par l'ItemFactory. 57 return item_factory.get_widget(" ") 58 59 def __init__(self): 60 self.entrees_menu = ( 61 ( "/_Fichier", None, None, 0, " " ), 62 ( "/Fichier/_Nouveau", " N", self.affiche_hello, 0, None ), 63 ( "/Fichier/_Ouvrir", " O", self.affiche_hello, 0, None ), 64 ( "/Fichier/_Enregistrer", " S", self.affiche_hello, 0, None ), 65 ( "/Fichier/Enregistrer _sous", None, None, 0, None ), 66 ( "/Fichier/sep1", None, None, 0, " " ), 67 ( "/Fichier/Quitter", " Q", gtk.main_quit, 0, None ), 68 ( "/_Options", None, None, 0, " " ), 69 ( "/Options/Test", None, None, 0, None ), 70 ( "/_Aide", None, None, 0, " " ), 71 ( "/_Aide/A propos", None, None, 0, None ), 72 ) 73 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL) 74 fenetre.connect("destroy", gtk.main_quit, "WM destroy") 75 fenetre.set_title("ItemFactory") 76 fenetre.set_size_request(300, 200) 77 78 boitev_princ = gtk.VBox(False, 1) 79 boitev_princ.set_border_width(1) 80 fenetre.add(boitev_princ) 81 boitev_princ.show() 82 83 barremenus = self.menu_principal(fenetre) 84 85 boitev_princ.pack_start(barremenus, False, True, 0) 86 barremenus.show() 87 fenetre.show() 88 89 def main(): 90 gtk.main() 91 return 0 92 93 if __name__ == "__main__": 94 ExempleItemFactory() 95 main()
Pour le moment, il n'y a que cet exemple. Une explication et de nombreux commentaires suivront plus tard.