Le sélecteur de couleur est, on l'aura deviné, un widget permettant une sélection interactive des couleurs. Ce widget composite permet à l'utilisateur de choisir une couleur en manipulant des triplets RVB (Rouge, Vert, Bleu) ou TSV (Teinte, Saturation, Valeur). Chacune des valeurs peut être ajustée à l'aide de gradateurs ou de champs de saisie, ou bien en désignant directement la couleur désirée dans une roue de teinte-saturation/barre de valeur. Il est également possible de définir l'opacité de la couleur.
Le sélecteur de couleur ne dispose actuellement que d'un seul signal, "color_changed". Il est émis à chaque modification de la couleur courante dans le widget, qu'elle vienne de l'utilisateur ou bien d'une définition explicite par la méthode set_color().
Observons à présent ce que peut nous offrir ce widget. Il est proposé sous deux formes différentes : gtk.ColorSelection et gtk.ColorSelectionDialog.
selectcouleur = gtk.ColorSelection()
Vous n'aurez probablement pas à utiliser ce constructeur directement. Il crée un gtk.ColorSelection orphelin auquel vous devrez affecter un parent vous-même. Le widget gtk.ColorSelection hérite du widget gtk.VBox.
dialselectcouleur = gtk.ColorSelectionDialog(title)
... où title (titre) est une chaine de caractères à utiliser pour la barre de titre de la boite de dialogue.
Il s'agit là du constructeur le plus courant pour les sélecteurs de couleur. Il crée un gtk.ColorSelectionDialog, qui consiste en un cadre (gtk.Frame) contenant un gtk.ColorSelection, un séparateur horizontal, ainsi qu'une boite horizontale possédant trois boutons : "Ok", "Cancel" and "Help". Ces derniers sont accessibles par les attributs ok_button, cancel_button et help_button du ColorSelectionDialog (ex : dialselectcouleur.ok_button). Pour accéder au sélecteur de couleur en lui-même, on utilisera l'attribut colorsel :
selectcouleur = dialselectcouleur.colorsel
Le widget gtk.ColorSelection dispose de plusieurs méthodes qui changent ses caractéristiques ou permettent d'accéder à la sélection de couleur.
selectcouleur.set_has_opacity_control(has_opacity)
Le sélecteur de couleur permet de régler l'opacité d'une couleur (aussi appelée canal alpha). Cette option est désactivée par défaut. Pour autoriser les réglages d'opacité, il faut appeler la méthode ci-dessus en donnant la valeur TRUE à son argument has_opacity. Inversement, l'appeler avec FALSE interdira cette possibilité.
selectcouleur.set_current_color(color) selectcouleur.set_current_alpha(alpha)
On peut définir explicitement la couleur courante en appelant la méthode set_current_color() avec une GdkColor. Le réglage d'opacité (le canal alpha) s'effectue avec la méthode set_current_alpha(). La valeur alpha doit être comprise entre 0 (transparence totale) et 65 636 (opacité totale).
couleur = selectcouleur.get_current_color() alpha = selectcouleur.get_current_alpha()
Pour récupérer la couleur courante, généralement lors de la réception d'un signal "color_changed", on utilise ces méthodes.
Le programme selectcouleur.py donne un exemple d'utilisation du gtk.ColorSelectionDialog. Le programme affiche une fenêtre contenant une zone de dessin qui, si elle est cliquée, ouvre une boite de dialogue de sélection de couleur. Les modifications de couleur effectuées dans cette boite de dialogue entrainent le changement de la couleur d'arrière-plan de la zone de dessin. La Figure 9.13 montre ce programme en exécution :
Le code source de selectcouleur.py est le suivant :
1 #!/usr/bin/env python
2
3 # exemple selectcouleur.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8
9 class ExempleSelecteurCouleur:
10 # Gestionnaire du signal "color_changed"
11 def rappel_color_changed(self, widget):
12 # On recupere la table des couleurs de la zone de dessin
13 tablecouleurs = self.zonedessin.get_colormap()
14
15 # On recupere la couleur courante
16 couleur = self.dialselectcouleur.colorsel.get_current_color()
17
18 # On definit la couleur d'arriere plan de la fenetre
19 self.zonedessin.modify_bg(gtk.STATE_NORMAL, couleur)
20
21 # Gestionnaire d'evenement de la zone de dessin
22 def evnmt_zone(self, widget, evnmt):
23 prisencharge = False
24
25 # On verifie si on a recu un evenement "button-press"
26 if evnmt.type == gtk.gdk.BUTTON_PRESS:
27 prisencharge = True
28
29 # Creation de la boite de dialogue du selecteur de couleur
30 if self.dialselectcouleur == None:
31 self.dialselectcouleur = gtk.ColorSelectionDialog(
32 "Selection de la couleur d'arriere-plan")
33
34 # On recupere le selecteur de couleur
35 selectcouleur = self.dialselectcouleur.colorsel
36
37 selectcouleur.set_previous_color(self.couleur)
38 selectcouleur.set_current_color(self.couleur)
39 selectcouleur.set_has_palette(True)
40
41 # Connexion au signal "color_changed"
42 selectcouleur.connect("color_changed", self.rappel_color_changed)
43 # Affichage de la boite de dialogue
44 reponse = self.dialselectcouleur.run()
45
46 if reponse -- gtk.RESPONSE_OK:
47 self.couleur = selectcouleur.get_current_color()
48 else:
49 self.zonedessin.modify_bg(gtk.STATE_NORMAL, self.couleur)
50
51 self.dialselectcouleur.hide()
52
53 return prisencharge
54
55 # Fermeture et sortie du gestionnaire
56 def destruct_fenetre(self, widget, evnmt):
57 gtk.main_quit()
58 return True
59
60 def __init__(self):
61 self.dialselectcouleur = None
62 # Creation d'une fenetre racine + titre + modes
63 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
64 fenetre.set_title("Test de selection de couleur")
65 fenetre.set_resizable(True)
66
67 # Connexion aux evenements "delete" et "destroy" pour pouvoir sortir
68 fenetre.connect("delete_event", self.destruct_fenetre)
69
70 # Creation de la zone de dessin + taille + recup evnmts des boutons
71 self.zonedessin = gtk.DrawingArea()
72
73 self.couleur = self.zonedessin.get_colormap().alloc_color(0, 65535, 0)
74
75 self.zonedessin.set_size_request(200, 200)
76 self.zonedessin.set_events(gtk.gdk.BUTTON_PRESS_MASK)
77 self.zonedessin.connect("event", self.evnmt_zone)
78
79 # Ajout de la zone de dessin a la fenetre, puis affichage des deux
80 fenetre.add(self.zonedessin)
81 self.zonedessin.show()
82 fenetre.show()
83
84 def main():
85 gtk.main()
86 return 0
87
88 if __name__ == "__main__":
89 ExempleSelecteurCouleur()
90 main()