Sommaire
Nous avons pratiquement déjà fait le tour du widget bouton. Il est en effet très simple. Lors de la création d'un bouton avec la fonction gtk.Button(), vous pouvez lui donner une étiquette en lui passant une chaine de caractères. Mais vous pouvez tout aussi bien créer un bouton vierge en ne passant rien à la fonction ; il vous suffira ensuite, si vous le souhaitez, de placer une étiquette ou une image pixmap dans ce nouveau bouton. Pour ce faire, créez une nouvelle boite et placez-y vos objets avec l'habituelle pack_start(). Puis, avec add(), placez la boite dans le bouton.
La fonction de création des boutons est la suivante :
bouton = gtk.Button(label=None, stock=None)
Si l'on donne une chaine de caractères à l'argument label, elle sera affichée sur le bouton. L'argument stock, quant à lui, sert à afficher sur le bouton une icône du stock de GTK ainsi que le texte correspondant. Les éléments du stock sont :
STOCK_DIALOG_INFO STOCK_DIALOG_WARNING STOCK_DIALOG_ERROR STOCK_DIALOG_QUESTION STOCK_DND STOCK_DND_MULTIPLE STOCK_ADD STOCK_APPLY STOCK_BOLD STOCK_CANCEL STOCK_CDROM STOCK_CLEAR STOCK_CLOSE STOCK_CONVERT STOCK_COPY STOCK_CUT STOCK_DELETE STOCK_EXECUTE STOCK_FIND STOCK_FIND_AND_REPLACE STOCK_FLOPPY STOCK_GOTO_BOTTOM STOCK_GOTO_FIRST STOCK_GOTO_LAST STOCK_GOTO_TOP STOCK_GO_BACK STOCK_GO_DOWN STOCK_GO_FORWARD STOCK_GO_UP STOCK_HELP STOCK_HOME STOCK_INDEX STOCK_ITALIC STOCK_JUMP_TO STOCK_JUSTIFY_CENTER STOCK_JUSTIFY_FILL STOCK_JUSTIFY_LEFT STOCK_JUSTIFY_RIGHT STOCK_MISSING_IMAGE STOCK_NEW STOCK_NO STOCK_OK STOCK_OPEN STOCK_PASTE STOCK_PREFERENCES STOCK_PRINT STOCK_PRINT_PREVIEW STOCK_PROPERTIES STOCK_QUIT STOCK_REDO STOCK_REFRESH STOCK_REMOVE STOCK_REVERT_TO_SAVED STOCK_SAVE STOCK_SAVE_AS STOCK_SELECT_COLOR STOCK_SELECT_FONT STOCK_SORT_ASCENDING STOCK_SORT_DESCENDING STOCK_SPELL_CHECK STOCK_STOP STOCK_STRIKETHROUGH STOCK_UNDELETE STOCK_UNDERLINE STOCK_UNDO STOCK_YES STOCK_ZOOM_100 STOCK_ZOOM_FIT STOCK_ZOOM_IN STOCK_ZOOM_OUT
Le programme boutons.py donne un exemple d'utilisation de gtk.Button() pour créer un bouton contenant une image et une étiquette. Le code de création de la boite est séparé du reste afin que vous puissiez l'utiliser dans vos programmes. Nous verrons d'autres exemples faisant appel à des images un peu plus loin dans ce tutoriel. La figure 6.1 montre la fenêtre et son bouton qui contient une étiquette et une image pixmap :
Voici le code source du programme boutons.py :
1 #!/usr/bin/env python 2 3 # exemple boutons.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 # On cree une boite verticale, on y place une image 10 # et une etiquette, et on renvoie la boite. 11 12 def boite_xpm_etiquette(parent, fichier_xpm, texte_etiquette): 13 # On cree une boite pour la pixmap et l'etiquette 14 boite1 = gtk.HBox(False, 0) 15 boite1.set_border_width(2) 16 17 # A present l'image. 18 image = gtk.Image() 19 image.set_from_file(fichier_xpm) 20 21 # On cree une etiquette pour le bouton. 22 etiquette = gtk.Label(texte_etiquette) 23 24 # On place la pixmap et l'etiquette dans la boite. 25 boite1.pack_start(image, False, False, 3) 26 boite1.pack_start(etiquette, False, False, 3) 27 28 image.show() 29 etiquette.show() 30 return boite1 31 32 class Bouton: 33 # Notre methode de rappel habituelle. 34 def salut(self, widget, donnees=None): 35 print "Salut ! - Clic sur le %s." % donnees 36 37 def __init__(self): 38 # Creation d'une nouvelle fenetre. 39 self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL) 40 41 self.fenetre.set_title("Bouton et image") 42 43 # C'est une bonne idee de faire ceci pour chaque fenetre. 44 self.fenetre.connect("destroy", lambda wid: gtk.main_quit()) 45 self.fenetre.connect("delete_event", lambda a1,a2: gtk.main_quit()) 46 47 # On fixe la largeur des bordures de la fenetre. 48 self.fenetre.set_border_width(10) 49 50 # Creation d'un nouveau bouton. 51 bouton = gtk.Button() 52 53 # On connecte le signal "clicked" du bouton a la fonction de rappel 54 bouton.connect("clicked", self.salut, "bouton cool") 55 56 # Ceci appelle notre fonction de creation de boites. 57 boite1= boite_xpm_etiquette(self.fenetre, "info.xpm", "bouton cool") 58 59 # On place et on affiche tous nos widgets. 60 bouton.add(boite1) 61 62 boite1.show() 63 bouton.show() 64 65 self.fenetre.add(bouton) 66 self.fenetre.show() 67 68 def main(): 69 gtk.main() 70 return 0 71 72 if __name__ == "__main__": 73 Bouton() 74 main()
De la ligne 12 à la ligne 32, on définit la fonction boite_xpm_etiquette() qui prend en charge la création d'une boite horizontale avec une bordure de 2 (lignes 14-15), puis y place une image (lignes 25) et une étiquette (ligne 26).
Aux lignes 32-66, on définit la classe Bouton. La méthode constructeur s'étale de la ligne 38 à la ligne 66 ; elle crée une fenêtre (ligne 39), lui donne un titre (ligne 41), connecte les signaux "delete_event" et "destroy" (lignes 44-45). Puis, à la ligne 51, elle crée le bouton sans étiquette, avant de connecter son signal "clicked" à la méthode de rappel salut() (ligne 54). Enfin, elle appelle la fonction boite_xpm_etiquette() à la ligne 57, afin de créer l'image et l'étiquette qu'elle placera dans le bouton à la ligne 60.
La fonction boite_xpm_etiquette() pourrait être utilisée pour placer des images pixmap et des étiquettes dans n'importe quel widget pouvant jouer le rôle de conteneur.
Le widget bouton peut émettre les signaux suivants :
pressed - émis lorsque le bouton de la souris est enfoncé sur le widget released - émis lorsque le bouton de la souris est relâché sur le widget clicked - émis lorsque le bouton de la souris est enfoncé puis relâché sur le widget enter - émis lorsque le pointeur de la souris arrive sur le widget leave - émis lorsque le pointeur de la souris quitte le widget