Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

9.13. Le sélecteur de couleur

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 :

Figure 9.13. Exemple de sélecteur de couleur

exemple sélecteur de couleur

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()