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: GtkColorSelection y GtkColorSelectionDialog.

  colorsel = gtk.ColorSelection()

Probablemente no uses este constructor directamente. Crea un control ColorSelection huerfano que tendrás que apadrinar tu 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. Este consiste en un Frame que contiene un control ColorSelection , un HSeparator y un HBox con tres botones, "Ok", "Cancelar" y "Ayuda". Puedes 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 canal alfa debe estar entre 0 (completamente transparente) y 65636 (completamente opaco).

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

Cuando tengas que mirar el color actual, típicamente al recibir la señal "color_changed", puedes usar estos 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   # example colorsel.py
    4   
    5   import gtk
    6	
    7	class ColorSelectionExample:
    8	    # Color changed handler
    9	    def color_changed_cb(self, widget):
   10	        # Get drawingarea colormap
   11	        colormap = self.drawingarea.get_colormap()
   12	
   13	        # Get current color
   14	        color = self.colorseldlg.colorsel.get_current_color()
   15	
   16	        # Set window background color
   17	        self.drawingarea.modify_bg(gtk.STATE_NORMAL, color)
   18	
   19	    # Drawingarea event handler
   20	    def area_event(self, widget, event):
   21	        handled = gtk.FALSE
   22	
   23	        # Check if we've received a button pressed event
   24	        if event.type == gtk.gdk.BUTTON_PRESS:
   25	            handled = gtk.TRUE
   26	
   27	            # Create color selection dialog
   28	            if self.colorseldlg == None:
   29	                self.colorseldlg = gtk.ColorSelectionDialog(
   30	                    "Select background color")
   31	
   32	            # Get the ColorSelection widget
   33	            colorsel = self.colorseldlg.colorsel
   34	
   35	            colorsel.set_previous_color(self.color)
   36	            colorsel.set_current_color(self.color)
   37	            colorsel.set_has_palette(gtk.TRUE)
   38	
   39	            # Connect to the "color_changed" signal
   40	            colorsel.connect("color_changed", self.color_changed_cb)
   41	            # Show the dialog
   42	            response = self.colorseldlg.run()
   43	
   44	            if response -- gtk.RESPONSE_OK:
   45	                self.color = colorsel.get_current_color()
   46	            else:
   47	                self.drawingarea.modify_bg(gtk.STATE_NORMAL, self.color)
   48	
   49	            self.colorseldlg.hide()
   50	
   51	        return handled
   52	
   53	    # Close down and exit handler
   54	    def destroy_window(self, widget, event):
   55	        gtk.mainquit()
   56	        return gtk.TRUE
   57	
   58	    def __init__(self):
   59	        self.colorseldlg = None
   60	        # Create toplevel window, set title and policies
   61	        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
   62	        window.set_title("Color selection test")
   63	        window.set_resizable(gtk.TRUE)
   64	
   65	        # Attach to the "delete" and "destroy" events so we can exit
   66	        window.connect("delete_event", self.destroy_window)
   67	  
   68	        # Create drawingarea, set size and catch button events
   69	        self.drawingarea = gtk.DrawingArea()
   70	
   71	        self.color = self.drawingarea.get_colormap().alloc_color(0, 65535, 0)
   72	
   73	        self.drawingarea.set_size_request(200, 200)
   74	        self.drawingarea.set_events(gtk.gdk.BUTTON_PRESS_MASK)
   75	        self.drawingarea.connect("event",  self.area_event)
   76	  
   77	        # Add drawingarea to window, then show them both
   78	        window.add(self.drawingarea)
   79	        self.drawingarea.show()
   80	        window.show()
   81	  
   82	def main():
   83	    gtk.main()
   84	    return 0
   85	
   86	if __name__ == "__main__":
   87	    ColorSelectionExample()
   88	    main()