Button, checkbutton y radiobutton
Existen tres diferentes clases de botones a parte del botón propio de los menús (el menubutton): el button, el checkbutton y el radiobutton. El primero, el button, es el ya conocido gracias al ejemplo del capítulo 10 de "Hola Mundo"; es el más clásico, y básicamente sirve para hacer una llamada a un comando para que se ejecute.
El segundo, el checkbutton, es un botón que puede tener dos estados: activado o desactivado; según sea su estado, una variable asociada tomará el valor 1 o 0; además también puede hacer llamadas a un comando en el momento de pulsarse.
El tercero, el similar al anterior, también posee dos estados posibles, pero la diferencia con este, radica en que los radiobutton aparecen siempre en grupos, de tal manera que sólo uno de cada grupo puede estar activado. Recibe su nombre de los botones de las antiguas radios para coches, en los que al pulsar un botón de sintonía, el anterior saltaba. Al igual que el checkbutton, también tienen una variable asociada para todo el grupo, de forma que tome el valor del radiobutton que esté activo en cada momento.
Button
La forma básica de crear un button es la siguiente:
button .b1 -text Boton1 -command "destroy ." -relief raised
Se ha creado un botón con el texto "Boton1", de relieve elevado, y que en caso de ser pulsado, destruirá su ventana.
Es frecuente que aparezca un número elevado de botones en una ventana, con la gran cantidad de líneas de código que esto conlleva. Una forma rápida y elegante de generar un buen número de botones sin excesivo código consiste en crear una lista con los textos de cada botón y otra con los comandos a ejecutar cada uno de ellos. A continuación, mediante el comando foreach o mediante un bucle for, se recorrerá la lista tomando el texto y el comando correspondiente y creando el botón.
El siguiente ejemplo implementa lo anteriormente explicado para crear una barra de tareas similar a la barra flotante de Microsoft Office.
En este ejemplo, y para hacer esta barra más parecida a la barra de Office, se colocan sobre los botones iconos y no texto. Para ello se parte de iconos en formato .GIF, que es el único que Tk acepta junto al .PPM y al .XBM, y se crean unas imágenes mediante el comando image create. De haberlo hecho con texto, hubiera sido exactamante igual.
El resultado es este:
Esta barra permitirá llamar, gracias al comando exec, al bloc de notas, a una ventana de MS-DOS, al Buscaminas, al Paint y al Word.
Radiobutton
Como ya se ha explicado anteriormente, estos botones, por su naturaleza, van agrupados, de manera que un sólo miembro de cada grupo puede estar activo en un momento dado. Al pulsar sobre otro del mismo grupo, el anterior deja de estar seleccionado. La característica común entre los radiobutton que forman un grupo es la variable; es decir, los radiobotones de un mismo grupo tienen la misma variable, que tomará un valor distinto según cuál sea el radiobutton activo. El nombre de la variable se especifica con la opcion -variable, y su valor con la opcion -value.
Así, para crear dos radiobotones para seleccionar entre el color rojo y el azul, sería:
radiobutton .rb1 -text Rojo -variable color -value rojo radiobutton .rb2 -text azul -variable color -value azul
Es una buena política aprovecharse de que en Tcl/Tk el valor de una variable puede ser casi cualquier cosa, y tomar como valor de la variable algo que pueda ser utilizado posteriormente.
Por ejemplo, en el caso anterior si se selecciona el color rojo la variable color tomará, lógicamente, el valor rojo; pero si después se desea hacer algo con este valor, como por ejemplo dibujar un círculo rojo, no se podría ya, que Tk entiende como color rojo red y no rojo. Hubiera sido mucho mejor haber tomado como valor red y blue. Esto que en este caso parece evidente, en otros ca no lo es tanto, siendo conveniente pensar bien el valor a tomar por la variable.
En el siguiente ejemplo se muestra una ventana con radiobuttons para la selección de la configuración de un PC.
En este ejemplo, puede verse que existe un gran número de frames, algunas de ellas necesarias y otras no. Se ha hecho así para colocar de una forma estática los radiobuttons, y para debujar un cierto reborde alrededor de los grupos de radiobotones.
El resultado puede verse aquí:

También se podrá ver en el código la utilización de la opcion -anchor w en el pack de cada radiobutton.Esto es así para que cada radiobutton se apile hacia la izquierda ( w, west, oeste). De no haberlo utilizado, el resultado hubiera sido este:

También se ha utilizado el widget label (etiqueta), que permite insertar un texto. Este widget es de muy fácil utilización y será tratado con profundidad en en el capítulo siguiente.
Checkbutton
El checkbutton es similar al radiobutton visto anteriormente, pero se diferencia de él en que cada checkbutton es independiente de cualquier otro, pudiendo estar varios cativos a la vez.
Cada checkbutton posee una variable distinta al resto de checkbuttons, y será esta la que tome el valor 1 (por defecto, pero puede ser cambiado) si estuviera activo, o 0 (por defecto) si estuviera inactivo.
La forma de crear un checkbutton sería:
checkbutton -text Chack1 -variable var1 -relief flat
Este ejemplo, aparte de algunas pequeñas modificaciones para derle un aspecto más estético, es una continuación del ejemplo de los radiobuttons, al que se le ha añadido unos checkbuttons para seleccionar el software. El resultado es este:
Opciones de los botones
Las opciones posibles para un botón son las siguientes:
|
activebackground |
Color del botón cuando el ratón está sobre él. |
|
activeforeground |
Color del texto del botón cuando el ratón está sobre este. |
|
background |
Color del botón. Se puede abreviar a bg. |
|
borderwidth |
Ancho del borde. Se puede abreviar a bd. |
|
command |
Comando a ejecutar por el botón ( button, radiobutton o ckeckbutton. |
|
font |
Fuente para el texto del botón. |
|
foreground |
Color del texto del botón. |
|
height |
Alto del botón en caracteres. |
|
highlightcolor |
Color del borde que lo rodea cuando tiene el foco. |
|
image |
Imagen a colocar sobre el botón. |
|
menu |
Menú que aparece cuando el botón es pulsado (menubutton) |
|
offvalue |
Valor de la variable de un checkbuton desactivado. |
|
onvalue |
Valor de la variable de un checkbutton activado. |
|
relief |
Relieve del botón ( flat, groove, raised, sunken o ridge) |
|
state |
normal (activable), o disabled (desactivado) |
|
text |
Texto del botón. |
|
textvariable |
Variable de un botón. |
|
underline |
Caracter que va a aparecer subrayado en un menú. |
|
value |
Valor que tomará la variable. |
|
variable |
Variable asociada a un botón. |
|
width |
Ancho de un botón en caracteres o en pixels (para imágenes) |
Operaciones con los botones
Las operaciones que es posible realizar con los botones son las siguientes, donde $w es el nombre del botón.
|
$w cget opcion |
Devuelve los valores del atributo especificado. |
|
$w configure ? opcion? ?valor? |
Configura el botón con el valor dado por valor para la opcion. |
|
$w flash |
Redibuja el botón varias veces en colores alternados. |
|
$w invoke |
Invoca la acción asociada con el botón $w. |
Menus
Como ya se comentó en la introducción de este trabajo, la version 8.0 proporciona una nueva forma, algo más simple, de crear menús. Hasta este momento los menús eran uno de los widgets más liosos, enrevesados y poco claros de Tk. Con la nueva versión se ha mejorado algo, pero aún siguen teniendo un código bastante confuso. Se va a hacer el mismo menú al estilo de la versión 7.6 y anteriores , y al estilo de la 8.0, para poder comparar las diferencias entre ambos.
La forma de cear un menú es la siguiente: primeramente se declara el menú como widget menu. A continuación, se crean cada uno de los items de la barra superior como cascade con el comando add. La palabra clave cascade indicará que pulsando sobre él se desplegará un menú. El siguiente paso consistirá en crear cada uno de los items de cada menú desplegable. estos items podrán ser comandos, botones de chequeo, botones de radio o separadores. Todos ellos se añadirán al menú mediante el comando add. Si se desean crear submenús, deberán crearse estos como cascade en lugar de comandos, checkbuttons o radiobuttons. No existe límite en el número de niveles de anidamiento de menús.El último paso consistirá en insertar el menú en la ventana con el comando configure.
Con el siguiente ejemplo se creará un menú que contiene todos los casos que se puedan presentar durante la creación de un menú.
El resultado obtenido es el siguiente:
El aspecto que presentan los menús al ser desplegados es este:
En el menú desplegable anterior se insertaron dis separadores. En el siguiente se van a añadir los denominados aceleradores, es decir, combinaciones de teclas que ejecutan lo mismo que el teclado, aunque este no está desplegado.
Es importante hacer notar que la inserción de los aceleradores es automática si se utiliza la opción del widget menu -accelerator. Pero esto no es suficiente para que funcione, ya que deben de añadirse los bind que permitan que al pulsar cierta combinación de teclas ocurra algo.
En el siguiente menú se insertaron dos menú desplegables en cascada, los cuales a su vez contienen radiobotones y botones de chequeo. En el caso de los radiobotones, son dos grupos de ellos totalmente idenpendientes entre sí.
El menú con botones de chequeo:
El menú con los dos grupos de botones de radio
Estos menús poseen una opción, -tearoff, que en caso de no estar a 0 permite convertir un menú en menú flotante con el sólo hecho de pulsar sobre una línea discontínua que presentarán en este caso. En el menú de ejemplo anterior no se deseaba esto y por ello se optó por poner esta opción a 0. De no haberlo hecho el resultado sería este:
Puede verse la línea discontínua en la que hay que pinchar con el cursor para convertir este menú en flotante.
Este es el aspecto una vez convertido el menú anterior en menú flotante. Hay que tener en cuenta que no es necesario que todos los menús tengan esta opción a 0 o con un valor distinto de cero; cada menú es independiente, en este aspecto, del resto.
La versión 8.0 es compatible con el estilo antiguo de los menús. Este estilo obligaba a declarar una frame donde iba a ser insertado el menú. La nueva versión presenta mejoras en cuanto a facilidad y legibilidad del código, pero también en otro apartado, como es el del aspecto nativo.
Su aspecto es mucho más "Windows", especialmente porque permite que al pasar sobre los destintos items del menú con el ratón estos se desplieguen de forma automática, cosa que no ocurría con la versión anterior, y que es una característica de Windows 95.
Para el que desee hacer los menús al estilo antiguo (compatibles con las versiones de Tcl/Tk para UNIX), aquí está el código del ejemplo anterior escrito al estilo antiguo.
|
index |
Indice numérico a partir de 0. |
|
active |
El item activado porque está sobre él el ratón. |
|
last |
El último item del menú. |
|
none |
Ninguno. |
|
ycoord |
El item bajo las coordenadas Y dadas. |
|
pattern |
Una cadena que se utiliza para buscar un nombre del menú que coincida con este patrón. |
|
$w active indice |
Ilumina el item especificado. |
|
|
$w add tipo ?opcion? ?valor? ... |
Añade un nuevo item del tipo dado y con las opciones dadas. |
|
|
$w cget opcion |
Devuelve los valores del atributo especificado. |
|
|
$w configure ? opcion? ?valor? |
Configura el botón con el valor dado por valor para la opcion. |
|
|
$w delete i1 ? i2 ? |
Borra los menus desde el índice i1 hasta el í2. |
|
|
$w entrycget indice opcion |
Devuelve el valor de la opción del menú especificado por indice. |
|
|
$w entryconfigure indice ?opcion? ?valor? |
Configura un item del menú con los valores dados para las opciones. |
|
|
$w index indice |
Devuleve el índice numérico para indice. |
|
|
$w post x y |
Presenta el menú en pantalla en X e Y. |
|
|
$w type indice |
Devuelve el tipo de item de indice. |
|
|
$w unpost |
Elimina el menú de la pantalla. |
|
|
$w yposition index |
Devuelve la posición Y de la parte superior del item del menú.. |
|
|
index |
Indice numérico a partir de 0. |
|
active |
El item activado porque está sobre él el ratón. |
|
last |
El último item del menú. |
|
none |
Ninguno. |
|
ycoord |
El item bajo las coordenadas Y dadas. |
|
pattern |
Una cadena que se utiliza para buscar un nombre del menú que coincida con este patrón. |