Table des matières
Certains widgets GTK ne possèdent pas de
fenêtre X associée, ils se dessinent juste sur leur widget parent. Donc, ils
ne peuvent recevoir d'évènements et si leurs dimensions sont incorrectes,
ils ne s'ajustent pas et vous pouvez obtenir des chevauchements d'écriture, etc.
Si vous voulez obtenir plus de ces widgets, il faut utiliser la boîte à évènement
EventBox
.
À première vue, la boîte à évènement EventBox
peut sembler totalement inutile. Elle ne dessine rien sur l'écran et ne
répond à aucun évènement. Cependant, elle réalise une fonction :elle
fournit une fenêtre X pour son widget enfant. Et comme beaucoup de widgets
ne possèdent pas de fenêtre X associée, cette fonction est importante. Ne pas
de fenêtre X économise de la memoire et augmente les performances mais
a aussi quelques inconvénients. Un widget sans fenêtre X ne peut recevoir
d'évènement, ne peut réaliser aucun ajustement sur son contenu et ne peut
posséder de couleur d'arrière-plan. Quoique le nom EventBox
met en évidence la fonction de gestion d'évènement, ce widget peut aussi être
redimensionné, (et plus encore, voir l'exemple ci-dessous).
Pour créer une nouvelle boîte à évènement
EventBox
, faire :
boite_evenement = gtk.EventBox()
Un widget enfant peut être ajouté à la boîte à évènement par :
event_box.add(widget
)
Le programme d'exemple eventbox.py illustre les deux utilisations de la boîte à évènement. Créer un label, inscrit dans une petite boîte, possédant un arrière-plan vert et permettant, lors d'un clic sur ce label, de sortir du programme. Redimensionner la fenêtre permet les variations de taille du label. La Figure 10.1, « Exemple de boîte à évènement » montre l'affichage du programme.
Voici le code source du programme eventbox.py :
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # exemple eventbox.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 class ExempleBoiteEvenement: 10 def __init__(self): 11 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL) 12 fenetre.set_title("Boîte à évènement") 13 fenetre.connect("destroy", lambda w: gtk.main_quit()) 14 fenetre.set_border_width(10) 15 16 # On crée une boîte à évènement et on l'ajoute à la fenêtre principale 17 boite_evenement = gtk.EventBox() 18 fenetre.add(boite_evenement) 19 boite_evenement.show() 20 21 # On crée un label long 22 label = gtk.Label("Cliquer ici pour quitter, finir, terminer, sortir...") 23 boite_evenement.add(label) 24 label.show() 25 26 # On fixe sa taille de départ (largeur, hauteur). 27 label.set_size_request(110, 30) 28 29 # On relie une action à la boîte 30 boite_evenement.set_events(gtk.gdk.BUTTON_PRESS_MASK) 31 boite_evenement.connect("button_press_event", lambda w,e: gtk.main_quit()) 32 33 # D'autres choses pour lesquelles il faut une fenêtre X... 34 boite_evenement.realize() 35 boite_evenement.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1)) 36 37 # Un arrière-plan en vert 38 boite_evenement.modify_bg(gtk.STATE_NORMAL, 39 boite_evenement.get_colormap().alloc_color("green")) 40 41 fenetre.show() 42 43 def main(): 44 gtk.main() 45 return 0 46 47 if __name__ == "__main__": 48 ExempleBoiteEvenement() 49 main()