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, , y
. 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:
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()