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