Las Toolbars (Barras de Herramientas) se usan normalmente para agrupar un número de controles y simplificar la personalización de su apariencia y disposición. Típicamente una barra de herramientas consiste en botones con iconos, etiquetas y pistas, pero se puede poner cualquier otro control en una barra de herramientas. Finalmente, los elementos se pueden colocar horizontal o verticalmente y se pueden ver los botones con iconos, texto, o ambos.
La creación de una barra de herramientas se consigue (como uno podría sospechar) con la siguiente función:
toolbar = gtk.Toolbar() |
Después de crear una barra de herramientas uno puede añadir al principio, al final o en otro posición, items (textos simples) o elementos (cualquier tipo de control) en la barra de herramientas. Para describir un item necesitamos un texto, un texto para la pista, un texto privado para la pista, un icono para el botón y una retrollamada. Por ejemplo, para añadir al principio o al final un item se pueden usar los siguientes métodos:
toolbar.append_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data=None) toolbar.prepend_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data) |
Si se quiere usar el método insert_item(), el único parámetro adicional que debe especificarse, es la posición en la cual el elemento se debe insertar. Así:
toolbar.insert_item(text, tooltip_text, tooltip_private_text, icon, callback,
user_data, position)
|
Para añadir de forma sencilla espacios entre items de la barra de herramientas se pueden usar los siguientes métodos:
toolbar.append_space() toolbar.prepend_space() toolbar.insert_space(position) |
Si es necesario, la orientación de una barra de herramientas, su estilo y el hecho de que las pistas estén disponibles, se puede cambiar sobre la marcha usando los siguientes métodos:
toolbar.set_orientation(orientation) toolbar.set_style(style) toolbar.set_tooltips(enable) |
Donde la orientation puede ser ORIENTATION_HORIZONTAL u ORIENTATION_VERTICAL. El style se usa para especificar la apariencia de la barra de herramientas y puede ser TOOLBAR_ICONS (iconos), TOOLBAR_TEXT (texto), o TOOLBAR_BOTH (ambos). El argumento enable puede ser o TRUE o FALSE.
Para mostrar algunas otras cosas que se pueden hacer con una barra de herramientas veamos el siguiente programa de ejemplo toolbar.py (interrumpiremos el listado con explicaciones adicionales):
1 #!/usr/bin/env python
2
3 # ejemplo toolbar.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8
9 class ToolbarExample:
10 # Este método se conecta al botón Close o
11 # al cierre de la ventana desde el Gestor de Ventanas
12 def delete_event(self, widget, event=None):
13 gtk.main_quit()
14 return gtk.FALSE
15
|
Este principio debería resultar familiar si no es el primer programa PyGTK. No obstante hay una cosa más, vamos a importar un bonito dibujo XPM (gtk.xpm) para que nos sirva de icono para todos los botones. La linea 10 empieza la clase de ejemplo ToolbarExample y las lineas 12-14 definen el método de retrollamada que finalizará el programa.
16 # es fácil... cuando se conmuta uno de los botones, simplemente 17 # comprobamos cuál está activo y cambiamos el estilo de la barra de herramientas 18 # de acuerdo con ello 19 def radio_event(self, widget, toolbar): 20 if self.text_button.get_active(): 21 toolbar.set_style(gtk.TOOLBAR_TEXT) 22 elif self.icon_button.get_active(): 23 toolbar.set_style(gtk.TOOLBAR_ICONS) 24 elif self.both_button.get_active(): 25 toolbar.set_style(gtk.TOOLBAR_BOTH) 26 27 # incluso más fácil, comprobamos la conmutación del botón 28 # y activamos/desactivamos las pistas 29 def toggle_event(self, widget, toolbar): 30 toolbar.set_tooltips(widget.get_active()) 31 |
Las lineas 19-30 son dos métodos de retrollamada que se llamarán cuando uno de los botones de la barra de herramientas se active. Estas cosas resultan familiares si ya se han usado botones biestado (y botones de exclusión mútua).
32 def __init__(self):
33 # Aquí está la ventana principal (un diálogo) y el asa
34 # necesitamos una barra de herramientas, un icono con máscara (uno para todos
35 # los botones) y un control de icono en el que ponerlo (aunque crearemos
36 # un control aparte para cada botón)
37 # creamos una nueva ventana con su título y un tamaño adecuado
38 dialog = gtk.Dialog()
39 dialog.set_title("GTKToolbar Tutorial")
40 dialog.set_size_request(450, 250)
41 dialog.set_resizable(gtk.TRUE)
42
43 # generalmente querremos salir si cierran la ventana
44 dialog.connect("delete_event", self.delete_event)
45
46 # para que tenga mejor aspecto ponemos la barra en la caja con asa
47 # de manera que se pueda separar de la ventana principal
48 handlebox = gtk.HandleBox()
49 dialog.vbox.pack_start(handlebox, gtk.FALSE, gtk.FALSE, 5)
50
|
Lo anterior debería ser común a cualquier otra aplicación PyGTK. Inicialización de una instancia de ToolbarExample, creación de la ventana, etc. Sólo hay una cosa que probablemente necesite más explicación: una caja con mango (asa) (HandleBox). Una caja con mango es simplemente otra caja cualquiera que puede usarse para meter controles dentro. La diferencia entre ella y las cajas típicas es que puede despegarse de la ventana padre (o, de hecho, la caja con mango permanece en el padre, pero se reduce a un rectángulo muy pequeño, mientras que todos sus contenidos cambian de padre a una nueva ventana flotante). Normalmente es bueno tener una barra de herramientas separable, por lo que estos dos controles suelen ir juntos normalmente.
51 # la barra de herramientas será horizontal, con iconos y texto, y 52 # con espacios de 5pxl entre elementos y, finalmente, 53 # la insertaremos en la caja con asa 54 toolbar = gtk.Toolbar() 55 toolbar.set_orientation(gtk.ORIENTATION_HORIZONTAL) 56 toolbar.set_style(gtk.TOOLBAR_BOTH) 57 toolbar.set_border_width(5) 58 handlebox.add(toolbar) 59 |
Bien, lo que hacemos arriba es una simple inicialización del control de la barra de herramientas.
60 # nuestro primer elemento es el botón <close>
61 iconw = gtk.Image() # control de icono
62 iconw.set_from_file("gtk.xpm")
63 close_button = toolbar.append_item(
64 "Close", # etiqueta de botón
65 "Closes this app", # la pista del botón
66 "Private", # información privada de la pista
67 iconw, # control icono
68 self.delete_event) # una señal
69 toolbar.append_space() # espacio tras el elemento
70
|
En el código anterior se puede ver el caso más simple: añadir un botón a la barra de herramientas. Justo antes de añadir el nuevo elemento, tenemos que construir un control de imágen que servirá como icono para este elemento; este paso tiene que repetirse para cada nuevo elemento. Justo después del elemento añadimos también espacio, para que los elementos siguientes no se toquen unos a otros. Como se puede ver, el método append_item() devuelve una referencia al control de botón recién creado, para que se pueda trabajar con él de la forma habitual.
71 # ahora, hagamos el grupo de botones de exclusión...
72 iconw = gtk.Image() # control de icono
73 iconw.set_from_file("gtk.xpm")
74 icon_button = toolbar.append_element(
75 gtk.TOOLBAR_CHILD_RADIOBUTTON, # type of element
76 None, # control
77 "Icon", # etiqueta
78 "Only icons in toolbar", # pista
79 "Private", # cadena privada de pista
80 iconw, # icono
81 self.radio_event, # señal
82 toolbar) # datos para la señal
83 toolbar.append_space()
84 self.icon_button = icon_button
85
|
Aqui empezamos a crear un grupo de botones de exclusión mútua. Para hacer esto usamos el método append_element() . De hecho, usando este método, uno puede también puede añadir items normales o incluso espacios (type = gtk.TOOLBAR_CHILD_SPACE (espacio) o gtk.TOOLBAR_CHILD_BUTTON (botón)). En el ejemplo anterior hemos empezado a crear un grupo de botones de exclusión mútua. Cuando se crean otros botones de exclusión mútua se necesita una referencia al botón anterior en el grupo, para que se pueda construir una lista de botones fácilmente (mira la sección RadioButtons de este tutorial). También tenemos una referencia al botón en la instancia de ToolbarExample para acceder a él más tare.
86 # los siguientes botones de exclusión se refieren a los anteriores
87 iconw = gtk.Image() # control de icono
88 iconw.set_from_file("gtk.xpm")
89 text_button = toolbar.append_element(
90 gtk.TOOLBAR_CHILD_RADIOBUTTON,
91 icon_button,
92 "Text",
93 "Only texts in toolbar",
94 "Private",
95 iconw,
96 self.radio_event,
97 toolbar)
98 toolbar.append_space()
99 self.text_button = text_button
100
101 iconw = gtk.Image() # control de icono
102 iconw.set_from_file("gtk.xpm")
103 both_button = toolbar.append_element(
104 gtk.TOOLBAR_CHILD_RADIOBUTTON,
105 text_button,
106 "Both",
107 "Icons and text in toolbar",
108 "Private",
109 iconw,
110 self.radio_event,
111 toolbar)
112 toolbar.append_space()
113 self.both_button = both_button
114 both_button.set_active(gtk.TRUE)
115
|
Creamos otros botones de exclusión mútua de la misma forma excepto que le pasamos uno de los botones creados al método append_element() para especificar el grupo.
Al final tenemos que establecer el estado de uno de los botones manualmente (si no todos tienen el estado activo, impidiéndonos que los vayamos intercambiando).
116 # aquí ponemos simplemente un botón biestado
117 iconw = gtk.Image() # control de icono
118 iconw.set_from_file("gtk.xpm")
119 tooltips_button = toolbar.append_element(
120 gtk.TOOLBAR_CHILD_TOGGLEBUTTON,
121 None,
122 "Tooltips",
123 "Toolbar with or without tips",
124 "Private",
125 iconw,
126 self.toggle_event,
127 toolbar)
128 toolbar.append_space()
129 tooltips_button.set_active(gtk.TRUE)
130
|
Un botón biestado se puede crear de la forma obvia (si ya se han creado botones de exclusión mútua alguna vez).
131 # para empaquetar un control en la barra, solamente tenemos 132 # crearlo y añadirlo con una pista apropiada 133 entry = gtk.Entry() 134 toolbar.append_widget(entry, "This is just an entry", "Private") 135 136 # bien, no está creada dentro de la barra, así que tenemos que mostrarla 137 entry.show() 138 |
Como se puede ver, añadir cualquier tipo de control a una barra de herramientas es fácil. La única cosa que se tiene que recordar es que este control debe mostrarse manualmente (al contrario que los elementos, que se mostrarán de golpe con la barra de herramientas).
139 # ¡ya está! Mostremos todo. 140 toolbar.show() 141 handlebox.show() 142 dialog.show() 143 144 def main(): 145 # nos quedamos en gtk_main y ¡esperamos que empiece la diversión! 146 gtk.main() 147 return 0 148 149 if __name__ == "__main__": 150 ToolbarExample() 151 main() |
La linea 142 termina la definición de la clase ToolbarExample. Las lineas 144-147 definen la función main() que simplemente llama a la función gtk.main() para iniciar el bucle de procesamiento de eventos. Las lineas 149-151 crean una instancia de ToolbarExample y luego entran en el bucle de procesamiento de eventos. Así termina el tutorial de la barra de herramientas. Por supuesto, para apreciarla en su máximo esplendor se necesita también el icono XPM, gtk.xpm. La figura Figura 10.8, “Ejemplo de Barra de Herramientas” muestar la ventana resultante: