9.13. Selección de Color

El control de selección de color es, como cabe de esperar, un control para seleccionar colores interactivamente. Este control compuesto permite al usuario seleccionar un color manipulando triples RGB (Rojo, Verde, Azul) y HSV (Tono, Saturación, Valor). Esto se consigue ajustando valores simples con deslizadores o entradas, o haciendo clic en el color deseado en una rueda de tono-saturación y una barra de valor. Opcionalmente, la opacidad del color también se puede especificar.

El control de selección de color solo emite una señal por ahora, "color_changed", que se emite siempre que el color actual del control cambie, bien porque el usuario lo cambia o porque se especifique explícitamente a través del método set_color() .

Veamos lo que nos ofrece el control de selección de color. El control viene en dos sabores: gtk.ColorSelection y gtk.ColorSelectionDialog.

  colorsel = gtk.ColorSelection()

Probablemente no se use este constructor directamente. Se crea un control ColorSelection huerfano que habría que emparentar uno mismo. El control ColorSelection hereda del control VBox.

  colorseldlg = gtk.ColorSelectionDialog(title)

donde title (título) es una cadena usada para la barra de título del diálogo.

Este es el constructor más común del selector de color. Crea un ColorSelectionDialog. Éste consiste en un Frame que contiene un control ColorSelection, un HSeparator y un HBox con tres botones, Ok, Cancelar y Ayuda. Se pueden obtener estos botones accediendo a los atributos ok_button, cancel_button y help_button del ColorSelectionDialog, (por ejemplo, colorseldlg.ok_button). El control ColorSelection es accesible usando la variable colorsel:

  colorsel = colorseldlg.colorsel

El control ColorSelection tiene unos cuantos métodos que cambian sus características o proporcionan acceso a la selección de color.

  colorsel.set_has_opacity_control(has_opacity)

El control de selección de color permite ajustar la opacidad de un color (también conocida como el canal alfa). Esto esta desactivado por defecto. Llamando a este método con has_opacity igual TRUE activa la opacidad. De la misma forma, has_opacity igual a FALSE desactivará la opacidad.

  colorsel.set_current_color(color)
  colorsel.set_current_alpha(alpha)

Puedes poner el color actual explícitamente llamando al método set_current_color() con un GdkColor. La opacidad (canal alfa) se pone con el método set_current_alpha().El valor del canal alfa alpha debe estar entre 0 (completamente transparente) y 65636 (completamente opaco).

  color = colorsel.get_current_color()
  alpha = colorsel.get_current_alpha()

Cuando se tenga que mirar el color actual, típicamente al recibir la señal "color_changed", se pueden usar esos métodos.

El programa de ejemplo colorsel.py demuestra el uso del ColorSelectionDialog. Este programa muestra una ventana que contiene un área de dibujo. Al hacer clic en ella se abre un diálogo de selección de color, y cambiando el color en dicho diálogo se cambia el color de fondo. La figura Figura 9.13, “Ejemplo de Diálogo de Selección de Color” muestra el programa en acción:

Figura 9.13. Ejemplo de Diálogo de Selección de Color

Ejemplo de Diálogo de Selección de Color

El código fuente de colorsel.py es:

    1	#!/usr/bin/env python
    2	
    3	# ejemplo colorsel.py
    4	
    5	import pygtk
    6	pygtk.require('2.0')
    7	import gtk
    8	
    9	class ColorSelectionExample:
   10	    # manejador de cambio de Color
   11	    def color_changed_cb(self, widget):
   12	        # Obtenemos el mapa de color del área de dibujo
   13	        colormap = self.drawingarea.get_colormap()
   14	
   15	        # Obtenemos el color actual
   16	        color = self.colorseldlg.colorsel.get_current_color()
   17	
   18	        # Fijamos el color de fondo de la ventana
   19	        self.drawingarea.modify_bg(gtk.STATE_NORMAL, color)
   20	
   21	    # manejador de eventos del área de dibujo
   22	    def area_event(self, widget, event):
   23	        handled = gtk.FALSE
   24	
   25	        # Comprobamos si se ha recibido un evento de pulsación de botón
   26	        if event.type == gtk.gdk.BUTTON_PRESS:
   27	            handled = gtk.TRUE
   28	
   29	            # Creamos el diálogo de selección de color
   30	            if self.colorseldlg == None:
   31	                self.colorseldlg = gtk.ColorSelectionDialog(
   32	                    "Select background color")
   33	
   34	            # Obtenemos el control ColorSelection
   35	            colorsel = self.colorseldlg.colorsel
   36	
   37	            colorsel.set_previous_color(self.color)
   38	            colorsel.set_current_color(self.color)
   39	            colorsel.set_has_palette(gtk.TRUE)
   40	
   41	            # Lo conectamos a la señal "color_changed"
   42	            colorsel.connect("color_changed", self.color_changed_cb)
   43	            # Mostramos el diálogo
   44	            response = self.colorseldlg.run()
   45	
   46	            if response -- gtk.RESPONSE_OK:
   47	                self.color = colorsel.get_current_color()
   48	            else:
   49	                self.drawingarea.modify_bg(gtk.STATE_NORMAL, self.color)
   50	
   51	            self.colorseldlg.hide()
   52	
   53	        return handled
   54	
   55	    # manejador de cierre y salida
   56	    def destroy_window(self, widget, event):
   57	        gtk.main_quit()
   58	        return gtk.TRUE
   59	
   60	    def __init__(self):
   61	        self.colorseldlg = None
   62	        # creación de la ventana principal, título y políticas
   63	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   64	        window.set_title("Color selection test")
   65	        window.set_resizable(gtk.TRUE)
   66	
   67	        # La conectamos a los eventos "delete" y "destroy" para poder salir
   68	        window.connect("delete_event", self.destroy_window)
   69	  
   70	        # Creamos un área de dibujo, fijamos su tamaño y capturamos eventos de botón
   71	        self.drawingarea = gtk.DrawingArea()
   72	
   73	        self.color = self.drawingarea.get_colormap().alloc_color(0, 65535, 0)
   74	
   75	        self.drawingarea.set_size_request(200, 200)
   76	        self.drawingarea.set_events(gtk.gdk.BUTTON_PRESS_MASK)
   77	        self.drawingarea.connect("event",  self.area_event)
   78	  
   79	        # Añadimos el área de dibujo a la ventana y mostramos ambos controles
   80	        window.add(self.drawingarea)
   81	        self.drawingarea.show()
   82	        window.show()
   83	  
   84	def main():
   85	    gtk.main()
   86	    return 0
   87	
   88	if __name__ == "__main__":
   89	    ColorSelectionExample()
   90	    main()