Informática
Diseño de interfaces de usuario: TCL-TK
Introducción
Tcl (abreviatura de tool command language) es un conjunto de dos cosas: un lenguaje de órdenes para el desarrollo de aplicaciones (guiones, o scripts) y un interprete para dicho lenguaje. Además, junto con Tcl se proporciona una herramienta asociada llamada Tk para su uso en entorno X-Windows en la creación de elementos gráficos. Tanto Tcl como Tk fueron diseñados y desarrollados por el profesor John Ousterhout, (Berkeley) apareciendo inicialmente para el sistema operativo UNIX, y posteriormente portado a otros sistemas operativos como MS-DOS, MS-Windows y MacOS.
Como lenguaje para aplicaciones es similar a otros existentes en UNIX, permitiendo por tanto la ejecución de otros programas. Proporciona los suficientes elementos de programación (variables, ordenes para control de flujo, posibilidad de crear procedimientos), que permiten construir aplicaciones complejas muy fácilmente, ensamblando programas ya existentes y creando por tanto nuevas aplicaciones.
Lo que distingue a Tcl de otros lenguajes de órdenes es su facilidad para incorporar un interprete a cualquier tipo de aplicación. No es necesario inventar un lenguaje de órdenes para cada aplicación. Añadiendo un interprete Tcl se posibilita estructurar una aplicación como un conjunto de primitivas que serán organizadas por medio de un guión para adecuarse mejor a las necesidades de los usuarios. También permite fácilmente añadir nuevas primitivas Tcl desarrolladas en C, si ello fuese necesario.
Hay muchas extensiones de Tc1 aunque la más importante es Tk, una herramienta para el entorno X-Windows que permite la creación y manipulación de interfaces de usuario. La técnica basada en guiones para la programación de nuevas interfaces de usuario presenta las siguientes ventajas:
-
Rapidez de desarrollo.
-
Interfaz de alto nivel con el entorno X
-
Separar la interfaz de la aplicación.
El nacimiento de Tcl. Características.
El objetivo primordial de Sun era crear un lenguaje complementario a Java que fuese inmune a los virus e independiente de la plataforma. Ello permitiría crear agentes de software que navegaran por la red Internet de una máquina a otra. En su origen, el profesor John Ousterhout y su equipo pretendían con Tc1 diseñar un lenguaje de metaprogramación, esto es, un lenguaje de programación de muy alto nivel, con la pretensión de enlazar de forma flexible cierto número de módulos escritos en diferentes lenguajes como C o Fortran.
Con Tcl si se añade alguna nueva característica al sistema (modificación de algún módulo), solo hará falta re-interpretar el código Tcl que enlaza los diferentes módulos, que no necesitan ser nuevamente compilados. En C++, la modificación de un módulo supone la modificación de las relaciones existentes entre los mismos, por contra, realizando la conexión de los módulos mediante Tcl, la modificación de uno de los módulos no supone la recompilación del resto.
El intérprete de Tcl
Tcl es, más que un lenguaje de programación, una herramienta de órdenes, al igual que el intérprete de órdenes Cshell de UNIX. Tanto el lenguaje como el intérprete fueron creados por el profesor John Ousterhout.
Para empezar.
Formato de las órdenes. Uso de comentarios.
La sintaxis general de una orden Tc1:
orden argu1 argu2 argu3...
La palabra orden es el nombre de la orden Tcl ó de un procedimiento Tcl desarrollado con anterioridad. Los argumentos se toman siempre como valores de cadena. Ello quiere decir que el intérprete Tcl es un intérprete de cadenas, en el que absolutamente todos los argumentos y órdenes se interpretan inicialmente como objetos del tipo cadena de caracteres. Tcl no interpreta los argumentos de la orden, si no que los pasa directamente a la orden quien es la encargada de interpretarlos por ejemplo, en la siguiente orden de asignación
set x [expr 3*sin(35)]
set es en este caso la orden, x es un argumento (variable asignada), y [expr 3*sin (35)] es el último argumento, los corchetes no forman parte del argumento, sino que son modificadores que indican que todo el contenido en un solo argumento.
Tcl usa el carácter # para indicar que la línea que se está escribiendo corresponde con un comentario de nuestro programa. Esta línea es omitida en el tratamiento del intérprete, y tiene sentido únicamente como aclaración de algún fragmento del código.
% # esto es un comentario
% set x 6; # a x se le da el valor
Variables
Una variable debe verse como un mero almacén de memoria, al que se le ha añadido un identificador que lo identifica unívocamente. Como en muchos de los lenguajes de programación usuales, pueden utilizarse caracteres ASCII exceptuando los habituales entre los que debemos señalar los signos de exclamación, interrogación y puntuación, corchetes, llaves, signos de operadores aritméticos, el espacio en blanco, acentos, etc.
Al igual que el lenguaje C. del que Tcl ha heredado muchas de sus características, en la formación de los identificadores se hace una distinción entre mayúsculas y minúsculas.
Se usa la orden set para la asignación de valores a una variable. Éstas pueden tener cualquier nombre y no es necesario inicializarlas antes de ser usadas. Si la variable que se va a utilizar en la asignación no existe, el intérprete Tc1 la crea. La sintaxis de la operación de asignación es la siguiente:
set <variable> <valor>
Como ya señalamos anteriormente, <valor> puede ser cualquier constante, variable o expresión. Por ejemplo:
% set x 6
6
Supongamos que ahora pretendemos asignar a la variable y el valor de la variable x. Tc1 es un lenguaje en el que no es necesario hacer declaración previa de variables el tipo de dato al que corresponde una variable se establece en el momento de su inicialización. La asignación queda del modo siguiente:
% set x 6
6
% set y $x
6
Si se utiliza la orden set sin señalar el segundo argumento, entonces el resultado obtenido es precisamente el valor que tiene la variable indicada como primer argumento
set x
6
Al igual que se pueden construir variables mediante la orden set, también es posible borrar dichas variables. Para ello se utiliza la orden unset, cuyo formato es el siguiente:
unset <variable>
Ejemplo:
% set x 6
6
% unset x
% # Se intenta leer el valor de la
variable x
% set X
can't read "x": no such variable
%# No se puede leer la variable, al haber sido destruida %# antes
La orden unset puede referirse a varias variables (separadas por espacio en blanco), en cuyo caso el resultado es la destrucción de todas las variables que se indiquen.
La orden info. Si en algún momento de la ejecución de nuestro programa deseamos conocer todas las variables existentes en el mismo, podemos hacer:
%info vars
El intérprete devolverá una lista con todas las variables que se encuentran vivas en ese instante.
Operaciones de entrada y salida.
En muchos sistemas operativos, el tratamiento que se hace de los dispositivos de entrada y salida es similar al tratamiento de ficheros. Es decir, el sistema operativo asocia a cada dispositivo de entrada/salida un fichero, de manera que se consigue el tratamiento uniforme de las entradas y de las salidas independientemente de su origen o destino. Así, al dispositivo estándar de entrada, que suele coincidir con el teclado, le es asignado un fichero cuyo nombre es stdin; el dispositivo estándar de salida, que suele coincidir con el monitor, tiene asignado el fichero stdout; por último, el fichero asignado al dispositivo por el que se va a dar salida a los errores se llama stderr Las ventajas de esta forma de tratamiento de las E/S son claras: Aparte de conseguir uniformidad en las operaciones, es posible redireccionar las entradas y salidas a ficheros distintos al estándar, de manera que un mismo programa puede ser utilizado para tomar las entradas desde teclado, o bien de otro fichero.
La forma de indicar a Tc1 que se desea realizar una entrada es mediante la utilización de la sentencia gets, y cuyo formato es el siguiente:
gets <fichero> [<línea>]
donde <fichero> es el fichero del que se va tomar la entrada, y [<linea>] es un parámetro opcional en el que se depositan los valores leídos. Cuando se realiza una lectura mediante la instrucción gets se lee una línea completa del fichero de entrada. Ejemplo:
% set x 25
% gets stdin x
999
% set $x
999
En cuanto a las salidas, la orden Tcl para realizarlas es
puts <fichero> <línea>
donde < fichero> es el fichero en el que deseamos mostrar la salida, y <linea> es el texto que deseamos mostrar. Cuando la salida deseamos realizarla en la pantalla (o dispositivo estándar de salida). entonces el nombre del fichero asociado será stdout. En cuanto al parámetro, línea, puede ser cualquier expresión válida en Tcl o una cadena de caracteres, o bien cualquier secuencia de órdenes.
Ejemplo:
% # cálculo del área de un triángulo
% puts stdout "Introduzca la longitud de la base”
Introduzca la longitud de la base
% gets stdin base
4
1
% puts stdout- "Introduzca la longitud de la altura"
Introduzca la longitud de la altura
% gets stdin altura
5
1
% set area [expr $base*$altura/2]
10
% puts stdout "El área del triángulo de base $base y altura $altura es $area"
El area del triángulo de base 4 y altura 5 es 10
El ejemplo que acabamos, de ver muestra la utilización de los agrupamientos mediante comillas dobles. En primer lugar se evalúan las expresiones que se encuentran dentro del agrupamiento, y a continuación se resuelve.
Control de flujo. Procedimientos.
Selección de alternativas.
Selección simple.
La selección simple va a consistir en lo siguiente:
if <CONDICIóN>
then :<SENTENCIAS-1>
else <SENTENCIAS-2>
Es decir, ante el valor de verdad de una expresión lógica, el algoritmo pasará a ejecutar una secuencia determinada de sentencias.
Ejemplo:
if {$a > $maximo}
then }set maximo $a}
else {sel a $máximo}
La ejecución de este ejemplo seria la siguiente:
En primer lugar, se evalúa la expresión $a > $máximo.
Si el resultado de esta expresión fuese VERDADERO (es decir, distinto de 0) entonces se ejecutaría la sentencia que asigna a la variable máximo el valor de la variable a.
Si por el contrario la variable la tuviera un valor menor o igual a máximo, en este caso, se ejecutaría la sentencia del grupo es decir, la variable a pasaría a tomar el valor de la variable máximo.
Selección de alternativas anidadas.
Como hemos visto, la estructura de una selección simple permite que el grupo de sentencias que acompañan a las cláusulas THEN y ELSE sean o bien una sentencia simple, o bien un conjunto de sentencias. Por tanto, podemos concluir que en ese grupo de sentencias se puede incluir otra sentencia condicional simple. Con esta estructura lo que obtenemos al final son lo que se denominan selecciones anidadas.
Podemos ver un ejemplo de esto, modificando el ejemplo anterior, dando ahora tres números como entrada en lugar de solamente dos. Es decir:
puts stdin “Valor de a”
gets stdin a
puts stdin “valor de b”
gets stdin b
puts stdin “valor de c”
gets stdin c
if {$a >$b}then {if {$a >$c}
then {puts stdout”$a es el mayor”}
else {puts stdout “$c es el mayor”} }
else{ if {$b >$c }
then {puts stdout “$b es mayor”}
else {puts stdout “$c es el mayor”} }
Selección de alternativas múltiples.
En Tcl se construye a partir de la sentencia switch. En Tcl, la sentencia switch incluye la posibilidad de tomar caminos según el parecido que tenga el valor de una cadena al valor esperado. De esta forma, la selección de una alternativa no viene dada por la coincidencia exacta con un valor, sino por la afinidad a dicho valor. El formato de la sentencia switch es el siguiente:
switch opción cadena
valor1 bloque1
valor2 bloque2
...
valorN bloqueN
default bloque
El significado de la construcción anterior es el siguiente:
opción es un modificador que permite determinar la forma de evaluación de los valores que debe tomar la variable. Así, existen varias posibilidades en dicha evaluación:
-
exact, es la opción por defecto, y debe entenderse como que el valor de la cadena coincide exactamente con el valor indicado. En esta situación, la utilización de la sentencia switch coincide con las alternativas múltiples tradicionales.
-
glob, en cuyo caso se entenderá que la comparación del valor de la cadena con el valor propuesto se realizará atendiendo a las reglas generales de comparación de cadenas existentes en UNIX (y que coinciden prácticamente con las de MS-DOS). En el capítulo dedicado a cadenas de caracteres se extenderá más sobre este punto.
-
regexp, en cuyo caso la coincidencia del valor de la cadena con los valores indicados se realizará atendiendo al cumplimiento por parte de la cadena de la expresión regular que se señale.
Los Bucles.
Los bucles controlados por contador.
El primer tipo de bucle son los bucles controlados por contador, que suelen venir representados en los diferentes lenguajes por la estructura for. En este tipo de bucles, el control de las iteraciones del cuerpo del bucle se realiza mediante una variable que, en cada pasada por la condición, se incrementa o decrementa, finalizando la ejecución del bucle cuando se alcanza un determinado valor. Por tanto, la principal característica de los bucles controlados por contador es que a priori se conoce el número de iteraciones que se van a realizar del bucle,
En Tcl, la sentencia for es similar a la sentencia de for del lenguaje C, con las mismas particularidades. La estructura sintáctica es la siguiente.
for <inicial> <test> <,final> <cuerpo>
donde <inicial> se corresponde con la sentencia (o grupo de sentencias) de Tcl que sirve como inicialización de nuestra variable contador. Esta sentencia se ejecuta únicamente la primera vez que se ejecuta el cuerpo del bucle, ignorándose en el resto de iteraciones. El < test > se corresponde con la condición de salida del bucle, y se ejecutará, siempre como primera instrucción del cuerpo del bucle, excepto en la primera iteración en que se ejecuta tras la inicialización. El grupo de sentencias < fina1 > es un conjunto de sentencias que se ejecutan tras el cuerpo del bucle en cada iteración y que se utilizan para la modificación del valor de nuestro contador
Ejemplo: Calcular el factorial de un número n, leído previamente del teclado:
#Lectura del número a leer
puts stdout “Introduzca un número entero mayor que cero”
gets stdin numero
#Estudio del factorial
if $numero<0
then {puts stdout “No existe el factorial de $numero”}
else { set factorial 1;
for { set i 1} {$i<$numero} { incr i }
{set factorial [expr $factorial*$i]}
puts stdout “ $numero != $factorial”}
La entrada con centinela.
No se conoce a priori el número de ejecuciones del bucle, sino que éste va a estar ejecutándose hasta que desde la entrada de datos (el exterior de nuestro programa) se produzca un evento que determine la finalización del bucle. A esta variable la vamos a llamar centinela. Dependiendo de la forma en que se evalúe el centinela, podremos hablar de dos tipos de bucles:
-
Bucles de evaluación previa, en los que la condición de finalización del bucle se evalúa al inicio del bucle, y el cuerpo se repite mientras dicha condición sea verdad. La condición es evaluada incluso antes de entrar por primera vez en el cuerpo del bucle, estructura while.
-
Bucles de evaluación posterior, en los que la condición se evalúa al final de la ejecución del cuerpo del bucle. En la primera iteración, la condición no es evaluada, por lo que este tipo de bucles nos asegura que el cuerpo del bucle se ejecuta siempre al menos una vez, sentencia repeat until
Ejemplo.
Se desea calcular la media de la nota de los alumnos de una clase. Suponemos que disponemos de un fichero de entrada (por ejemplo, el fichero estándar de entrada, stdin) en el cual, existe una marca de fin de fichero, es decir, un carácter especial que nos indica cuándo han terminado los datos. Concretamente, dicha marca será la introducción por teclado del valor - 1.
gets stdin nota
set media 0
set numAlumnos 1
while {$alumno <> -1}{
incr numAlumnos 1;
set media {expr media + nota};
gets stdin nota }
set media {expr media/ 1{ decr numAlumnos 1 }
puts stdout “La nota media es $media”
Bucles controlados por variables.
El último tipo de bucles que vamos a estudiar son los bucles controlados por variable. La evaluación del final del flujo del bucle se hace mediante tina variable que va tomando valores en un rango determinado e indicado en la propia sentencia. Básicamente, este tipo de bucles son idénticos a los bucles controlados por contador, solo que ahora no es necesario decrementar o incrementar el valor de la variable al final de la ejecución del bucle. El nuevo valor de la variable que hace las veces de contador se extrae secuencialmente de entre los valores de una lista. Obviamente, en este tipo de bucles se conoce con exactitud el número de iteraciones que se van a realizar del cuerpo del bucle.
La estructura que va a tener este tipo de bucle es la siguiente:
foreach <variable> <lista> <cuerpo>
La variable, <variable> tomará en cada iteración el valor que se encuentre en la lista de valores que se señalen a continuación.
Ejemplo: Calcula la suma de los diez primeros números primos.
set suma 0
foreach primo { 1 2 3 5 7 11 13 17 19 23}{
set suma {expr suma + primo } }
Procedimientos
Un procedimiento se define en Tcl por medio de la orden proc. Su sintaxis es:
proc <nombre> <parámetros> <cuerpo>
Ejemplo:
proc factorial { n }
{
set acum 1;
for {set i 1} {$i<=$n} { set acum [expr $i*$acum]}
return $acum
}
Tal y como se indica son tres los parámetros usados por la orden proc. El primero es el nombre del procedimiento, que podrá ser cualquier identificador el segundo es una lista que contiene los nombre de los parámetros, y que como lista que es, deberá ir encerrada entre llaves. El tercero es el cuerpo del procedimiento. Al tratarse igualmente de una lista de sentencias, también deberemos utilizar la notación de llaves, y la separación de las diferentes órdenes mediante punto y coma. Una vez definido, el procedimiento podrá ser usado como cualquier otra orden de Tcl.
Debido a que en Tcl todas las órdenes, independientemente de su acción, devuelven un valor, se obliga a que los procedimientos devuelvan algún valor. Si en el cuerpo del procedimiento no se devuelve explícitamente un valor mediante la orden return el procedimiento devolverá como valor el de la última orden ejecutada.
Estructuras de datos complejas.
El tipo de dato string.
Para Tcl las cadenas de caracteres son el único tipo de dato. Esto es, los objetos son todos una secuencia de caracteres o signos, debemos destacar ese hecho, ya que debido a ello existen múltiples órdenes en Tcl que permiten el tratamiento de las cadenas de caracteres de una forma mucho más extensa que en C o Pascal. La sintaxis general para la orden string es:
string <operación> <variable> <otros argumentos>
El primer argumento determina qué hacer; el segundo sobre qué cadena se va a realizar la acción, y el resto, si los hay, dependen de la operación a realizar. En el caso de que la orden implique la utilización de un índice de valores, se comienza a contar desde 0, al igual que ocurre en C. El término end se refiere al último carácter de la cadena.
Opciones:
String compare cadena1 cadena2 | Compara cadenas. Devuelve 0 si son iguales, 1 si cadena1 es menor que cadena2 y - 1 en otro caso. |
String first cadena1 cadena2 | Devuelve el índice en cadena2 en que comienza la primera ocurrencia de cadena 1 o - 1 en otro caso. |
String index cadena índice | Devuelve el carácter numero índice de cadena. |
String length cadena | Devuelve la longitud de cadena. |
String match modelo cadena | Devuelve 1 si en cadena se encuentra modelo, en caso contrario, devuelve 0. |
String range cadena i j | Devuelve la subcadena de cadena que comienza en i y acaba en el j. |
String tolower cadena | Convierte cadena a mayúsculas. |
String toupper cadena | Convierte cadena a minúsculas. |
String trim cadena caracteres | Elimina M comienzo y M final de cadena los caracteres indicados por caracteres. Por defecto caracteres son los espacios en blanco. |
String trimleft cadena caracteres | Igual que en el caso anterior, pero solo elimina caracteres del comienzo de cadena. |
String trimright cadena caracteres | Como en el caso anterior, pero solo elimina caracteres del final de cadena. |
Ejemplo:
% set x “me llamo beni”
me llamo beni
% set y “,cuevas”
,cuevas
% string length $x
13
% string length $y
7
Listas
Una lista es una estructura de datos en la que los elementos de la misma son todos del mismo tipo. La principal característica de las listas, y que las diferencia de otras estructuras de datos es que se desconoce a priori el número de elementos que la componen. Es decir, las operaciones elementales que tendrán estas estructuras de datos serán las operaciones de inserción y borrado. Las listas se implementan en Tc1 como si se tratara de cadenas.
Debido al especial tratamiento que se hace de las listas, éstas se deben usar únicamente si van a contener pocos elementos, o bien para la construcción de órdenes que se evaluarán posteriormente. Para el manejo de mayores volúmenes de datos se muestran más adecuadas y eficientes las matrices.
Órdenes relacionadas con las listas:
List argu1 argu2 | Crea una lista con todos los argumentos |
index lista i | Devuelve el elemento i-esimo de la lista |
llenght lista | Devuelve el número de elementos de una lista |
(continuación)
1range lista i j | Devuelve las listas formada por los elementos de¡ i al j de lista |
lappend 1ista arg1 arg2 | Añade elementos a lista |
linsert lista i ar1 ar2 | Inserta en lista a partir de la posición i los argumentos, generando una lista nueva |
lreplace lista i j ar1 ar2 | Reemplaza los elementos ente el i y el j de una lista por los argumentos. Genera una nueva lista |
lsearch modo lista valor | Devuelve el índice del elemento de lista que coincide con valor. El modo puede ser -exact -glob ó -regexp. Devuelve -1 si no se encuentra nada. |
lsort indicador lista | Ordena elementos de una lista según el indicador, que puede ser: -ascii, -integer, -real, - increasing, -decreasing ó -command |
concat lista1 lista2 lista3 | Junta varias listas en una sola. |
Array
El tratamiento que se hace de las matrices en Tcl difiere bastante al de otros lenguajes de programación, especialmente en el aspecto de que no se hace mención explícita al tamaño del array en el momento de su declaración, cosa que sí es necesario hacer en otros lenguajes como C o Pascal.
Una matriz es una variable con un índice el cual es tratado como una cadena de caracteres, por lo que se puede pensar en las matrices como aplicaciones de una cadena (el índice) en otra cadena (el valor del elemento de la matriz). A pesar de ello, internamente se implementa como una tabla hash estableciéndose una correspondencia entre cada cadena utilizada como índice y cualquier valor ordinal, por lo que el tiempo de acceso a cada elemento es prácticamente el mismo. El orden de los índices viene determinado por el orden de las cadenas de caracteres.
Para señalar el índice del array se delimita con paréntesis. Los elementos de una matriz se definen con set- y se obtienen por medio de la sustitución $. Por tanto, para que la matriz esté totalmente definida habrá que definir todos y cada uno de los elementos de la misma.
Ejemplo
set matriz(0) Manolo set matriz(2) Pepe
La orden array devuelve información sobre las variables de matrices.
Opciones.
Array exist matriz | Devuelve 1 si matriz es una variable de tipo array |
Array get matriz | Devuelve una lista que alterna entre el índice y los valores de la matriz |
Array names matriz modelo | Devuelve los valores del índice de matriz ó solo los coincidentes con el patrón modelo |
matriz 1ista | Inicializa una matriz a partir de una lista que debe tener valores que alternan entre el índice y el valor |
array size matriz | Devuelve el tamaño de matriz |
Ejemplo
set media 0
for {set i 0} {$i<100} {incr i}{
gets stdin nombre($i);
gets sidin nota($i);
sel media [expr $media+$nota($i)]
}
set media [expr $media/100.0]
for {set i 0} {$i<100} {incr i}
if { $nota($i)<media }
then {puts stdout “$nombre($i) ha aprobado”
}
Los ficheros en Tcl.
Los nombre de ficheros se especifican en Tc1 usando la sintaxis normal incluyendo la posibilidad de usar caminos completos. La orden pwd nos devuelve la carpeta de trabajo, mientras que la orden cd permiten movernos entre subdirectorios.
Ordenes relativas a ficheros son:
close <fichero> | Cierra el fichero de ese identificador |
Eof | Devuelve 1 se ha llegado a fin de fichero |
file <operación><nombre><arg> | Ejecuta una operación sobre el fichero nombre |
flush <fichero> | Vacía el buffer correspondiente al fichero. |
qets <fichero> <variable> | Lee la siguiente línea de fichero hasta un carácter de nueva línea. El resultado lo asigna var y lo devuelve como resultado. |
open<fichero> <modo> | Abre el fichero con el modo de acceso indicado por modo. Puede ser:
|
puts [<nonewline>] <fichero><cadena> | Escribe cadena en fichero añadiendo o no un carácter nueva línea. |
read <-nonewline> ficheroid | Lee y devuelve todo los bytes en ficheroid Con el parámetro -nonew1ine, la nueva línea final, si existe, se machaca. |
read <ficheroid> <numeroby> | Lee del ficheroID el número de bytes especificado ó hasta el final de fichero. |
Órdenes para tratamiento no secuencial de ficheros.
seek | Mueve el puntero de lectura o escritura a una posición determinada indicada en bytes. Se pueden usar las palabras clave: start, current ó end como tercer argumento para indicar el origen del desplazamiento. |
(continuación)
Tell | Indica la posición actual del punto. |
Eof | Devuelve cierto si la ultima lectura (con gets o read) ha intentado leer pasado en fin de fichero. |
Programación en C y Tcl
Tcl esta diseñado para ser fácilmente extensible a través de la programación de nuevos comandos en C. Un comando implementado en C, es más eficiente que un procedimiento equivalente de Tcl. Otra buena razón para escribir código C es que no es posible obtener la misma funcionalidad con Tcl que con C.
Una alternativa a escribir nuevos comandos en C es escribir programas independientes en C y luego ejecutarlos desde Tcl con el comando exec. Esto es comparable a invocar comandos Tcl desde la misma aplicación.
Otra forma de ver Tcl es como una librería de C que es fácilmente integrable a la aplicación existente. Añadiendo el intérprete de Tcl, puedes configurar y controlar tu aplicación con scripts Tcl, y con Tk puedes proveerlo de una agradable interfaz gráfica. Este era el modelo original para Tcl.
Estructura de la aplicación
La librería Tcl de C implementa el intérprete y los comandos Tcl como: set, while, proc, open, socket. Los comandos específicos para una aplicación se implementan en C o C++ y se registran como comandos en el intérprete. El interfaz de todos los comandos Tcl es el mismo. El intérprete llama a estes procedimientos cuando un script usa un comando Tcl. Puedes también cargar extensiones que implementen suites de comandos Tcl en código compilado.
Creación de un paquete cargable
Puedes organizar tu código C en un paquete cargable que puede ser lincado dinámicamente en tclsh, wish o en tu propia aplicación. Cuando el paquete se carga, Tcl llama a un procedimiento de C llamado package_Init , donde package es el nombre de tu paquete.
Ejemplo (Procedimiento de inicialización de un paquete cargable):
/* ramdom.c */
#include <tcl.h>
/*
* declaraciones para comandos específicos de una aplicación
*/
int RandomCmd (ClientData clientData,
Tcl_interp *interp,
Int argc, char *argv[]);
Int RandomObjCmd (ClientData clientData,
Tcl_interp *interp,
Int objc, Tcl_Obj *CONST objv[]);
/*
* El procedimiento de inicialización se llama
* cuando se carga el paquete
*/
int Random_Init (Tcl_Interp *interp) {
/*
* Registro de dos variaciones de random
* el comando orandom usa el objeto interfaz
*/
Tcl_CreateCommand (interp, “random”, RandomCmd, (ClientData)NULL,
(Tcl_CmdDeleteProc *)NULL);
Tcl_CreateObjCommand (interp, “orandom”, RandomObjCmd, (ClientData)NULL,
(Tcl_CmdDeleteProc *)NULL);
/*
* Declaración de que nosotros implementamos el paquete random
* así que los scripts que hacen package require random
* pueden cargar la librería automáticamente
*/
Tcl_PkgProvide (interp, “random”, “1.1”);
return TCL_OK;}
Este ejemplo registra un procedimiento, “RandomCmd”, que implementa un nuevo comando Tcl, “random”. Cuando el script Tcl usa el comando “random”, el procedimiento RandomCmd será invocado por el intérprete de Tcl. Existen dos tipos de declaraciones de comandos para la comparación: el original Tcl_CreateCommand y el nuevo Tcl_CreatteObjCommand.
El comando load
El comando load de Tcl se usa para lincar dinámicamente un paquete compilado:
load library package ?interp?
Library es el nombre de archivo de la librería compartida, y package es el nombre del paquete implementado por la librería. Interp es opcional, y es el argumento que permite cargar la librería dentro del intérprete.
Si por ejemplo la librería estuviese en /usr/local/lib/random.so, entonces el script Tcl podría cargar el paquete así:
load /usr/local/lib/random.so Random
Uso de Tcl_PkgProvide
Random_Init usa Tcl_PkgProvide para declarar qué paquete se proveyó bajo código C. Esta llamada ayuda al procedimiento Pkg_Index a aprender que librerías proveen que paquetes. Este almacena la información en una base de datos de paquetes, la cual es un archivo llamado pkgindex.tcl. El comando package require busca a lo largo de la base de datos los archivos por su auto_path e inicializan el array auto_index para contener los comandos propios. El proceso general es:
Crear tu librería compartida. Poner la librería en el directorio indicado en la variable auto_pack, o en un subdirectorio de uno de los directorios indicados en dicha variable.
Ejecutar el procedimiento pkg_mkIndex en ese directorio, dando los nombres de todos los archivos script y librerías compartidas que debe de indexar. Ahora la librería compartida esta lista para ser usada por otros scripts.
Un script usa package require para solicitar un paquete. El comando correcto load para tu sistema será usado la primera vez que un comando de tu paquete sea usado. El comando package es el mismo en todas las plataformas (UNIX, Windows, Macintosh...).
package require Random
La interfaz de comandos de cadenas
El interfaz original, basado en el uso de cadenas, para un procedimiento de C es como el interfaz del main. Los argumentos del comando Tcl están disponibles como un array de cadenas definido por un parámetro argv y enumerados por un parámetro argc.
Adicionalmente el intérprete se pasa a lo largo de los datos de los clientes que están registrados cuando el comando fue definido con Tcl_CreateCommand. Los datos del cliente son útiles si el mismo procedimiento está implementando muchos comandos diferentes.
El valor de retorno de un comando Tcl es o una cadena o un mensaje de error. El campo result en la estructura de datos Tcl_interp almacena estos valores, y el procedimiento devuelve o bien TCL_OK o TCL_ERROR para indicar correcto o fallido. El procedimiento puede devolver también TCL_BREAK, TCL_CONTINUE, ó código de una aplicación específica, los cuales podrían ser útiles si tu estas implementando nuevos tipos de estructuras de control incorporadas.
La implementación del random acepta un argumento opcional que es el rango sobre el cual se devolverán los números aleatorios. El parámetro argc se testea para ver si este argumento a sido dado en el comando Tcl. Por ejemplo en el caso de que argc=2 entonces querrá decir que el comando ha sido invocado de la siguiente forma: random 25.
El procedimiento Tcl_GetInt convierte la cadena de números en un entero.
Finalmente, el verdadero trabajo de llamar al random estaba hecho, y el resultado es formateado directamente dentro del buffer de resultado usando sprintf. TCL_OK es devuelto a la señal de suceso.
Manejo de la cadena resultado
Existe un simple protocolo para manejar el almacenamiento para una cadena resultado de un procedimiento. Él supone interpresult, los cuales poseen el valor, e interpfreeProc determina como se ha de limpiar el almacenamiento. Cuando un comando es llamado, el intérprete provee almacenamiento por defecto de TCL_RESULT_SIZE, el cual es 200 Bytes. La acción por defecto de limpieza es no hacer nada. Esto soporta dos simples maneras de definir el resultado un comando. Una forma es usar sprintf para formatear el resultado en el lugar:
sprintf (interpresult, “%d”, rand);
Usar sprintf es conveniente si tu sabes que la cadena resultado es corta, lo cual es a menudo el caso. El otro camino es colocar interpresult en la dirección de una constante cadena. En este caso el resultado original del buffer no se usa, por lo tanto no se requiere limpieza porque la cadena está compilada dentro del programa:
interpresult = ”Usage: random ?random?”;
En los casos más generales los siguientes procedimientos deben de ser usados para manejar los campos result y freeProc.
Tcl_SetResult (interp, string, freeProc)
Tcl_AppendResult(interp, str1, str2, str3, (char *)NULL)
Tcl_AppendElement(interp, string)
Tcl_SetResult coloca el valor de retorno que va a ser de tipo string (cadena). El argumento freeProc describe como debe de ser dispuesto el resultado. TCL_STATIC se usa en el caso en donde el resultado es una constante de tipo cadena asignada por el compilador. TCL_DYNAMIC se usa si el resultado es asignado con Tcl_Alloc, el cual es una plataforma de compilación independiente de malloc. TCL_VOLATILE se usa si el resultado esta en una variable de tipo pila. En este caso el intérprete de Tcl hace una copia del resultado antes de llamar a ningún otro procedimiento. Finalmente, si tu tienes tu propio asignador de memoria, pásalo en la dirección del procedimiento que debería de liberar el resultado.
Tcl_AppendResult copia sus argumentos en el buffer de resultados, reasignando el buffer si es necesario. Los argumentos son concatenados al final del resultado existente, si lo hay. Tcl_AppendResult puede ser llamado varias veces para hacer un resultado. El buffer de resultado esta sobreasignado así que varios appends son eficientes.
Tcl_AppendElement añade la cadena al resultado como una lista de elementos propia de Tcl. Añadiría correctores ó barras invertidas para conseguir su propia estructura.
La interfaz de Objetos Comando
El Tcl 8.0 suplanta las cadenas con objetos dual-ported. Los argumentos de un comando son arrays de objetos. El objc enumera los objetos de un comando Tcl, incluyendo el nombre del comando, el objv es un array de punteros a estos objetos. El resultado de un comando es también un objeto. Las variables poseen un valor objeto, y también los scripts Tcl.
La estructura de los objetos dual-ported almacena una cadena de representación y un objeto nativo de representación secundario. La representación nativa depende del tipo de objeto. Los enteros son almacenados como enteros de 32 bits. Los valores en coma flotante son almacenados como de doble precisión. Las listas Tcl son almacenadas como un array de punteros a cadenas. Los scripts Tcl son almacenados como secuencias de código. La conversión entre la representación nativa y la cadena esta siendo muy demandada. Existen APIs para acceder a los valores del objeto, por lo tanto tú no tienes problemas de tipos de conversiones a menos que tu implementes un nuevo tipo. A continuación se muestra el comando random usando interfaces basados en objetos.
/*
* RandomObjCmd
* Esto implementa el comando Tcl random
* del ejemplo de antes.
*/
int RandomObjCmd (ClientData clientData, Tcl_Interp *interp,
int objc, Tcl_Obj *CONST objv[])
{
Tcl_Obj *resultPtr;
Int rand, error;
Int limit = 0;
if (objc > 2)
{
Tcl_WrongNumArgs (interp, 1, objv, “Usage: random ?range?”);
Return TCL_ERROR;
}
if (objc == 2)
{
error = Tcl_GetIntFromObj (interp, objv[1], &limit);
if (error != TCL_OK)
{
return error;
}
}
rand = random( );
if (limit!=0)
{
rand = rand % limit;
}
resultPtr = Tcl_GetObjResult (interp);
Tcl_SetIntObj (resultPtr, rand);
Return TCL_OK;
}
Si comparas los dos ejemplos puedes observar que son similares. La llamada a Tcl_GetInt es reemplazada por la llamada a Tcl_GetIntFromObj. Esto proporciona un valor entero para el argumento:
error = Tcl_GetIntfromObj (interp, objv[1], &limit);
El resultado se consigue echando una mano al objeto resultado y asignando su valor:
ResultPtr = Tcl_GetObjResult (interp);
Tcl_SetIntObj (resultPtr, rand);
En el ultimo ejemplo no se aprecia nada obvio sobre el manejo del almacenamiento. Si se sigue este simple ejemplo, no existe problema alguno sobre el almacenamiento para los objetos Tcl. Tcl inicializa el objeto resultado antes de llamar a tu comando y se muestra cuidadoso de borrarlo luego. Es suficiente escoger un valor y devolver TCL_OK ó TCL_ERROR.
Si tu comando devuelve una cadena, entonces deberás de usar Tcl_SetStringObj. Este comando hace una copia de la cadena que le pasas. Las nuevas interfaces de Tcl que toman cadenas también miden las longitudes de los datos que tu puedes pasar en binario en las cadenas. Si la longitud es -1, entonces la cadena termina en un byte nulo (NULL). Un comando que siempre devuelve boring haría:
ResultPtr = Tcl_GetObjResult (interp);
Tcl_SetStringObj (resultPtr, “boring”, -1);
Manejo de objetos contadores de referencia
En situaciones más complejas necesitas preocuparte por el modelo de almacenamiento de los objetos Tcl. Existen APIs para acceder a todos esos aspectos de un objeto, por lo que tu puedes abstenerte de hacer manipulación directa a través de Tcl_Obj a menos que implementes un nuevo tipo.
Los objetos Tcl son contadores de referencia. Cada tipo de implementación proporciona unos pocos procedimientos como estos:
Tcl_GetTypefromObj (interp, objPtr, valuePtr);
Tcl_SetTypeObj (resultPtr, value);
ObjPtr = Tcl_NewTypeObj (value);
El Tcl_NewTypeObj asigna almacenamiento para un objeto y pone su contador de referencia a uno. El Tcl_IncrRefCount y Tcl_DecrRefCount incrementa y decrementa el contador de referencia de un objeto. Cuando el contador de referencia llega a cero, el almacenamiento está liberado.
Los procedimientos Tcl_GetTypeFromObj Y Tcl_SetTypeFromObj proporcionan y obtienen el valor; el contador de referencia no cambia. Las conversiones de tipo son automáticas. Tu puedes asignar un objeto a un entero y obtener luego una cadena numérica de doble precisión. Las implementaciones de tipos se muestran cuidadosas sobre el almacenamiento de los valores de los objetos y sus cambios. Por supuesto, si un objeto permanece en su tipo original, los accesos son más eficientes.
Cuando se llama un comando de C, Tcl no incrementa automáticamente el contador de referencia de los argumentos. De cualquier manera, las referencias extras a través de llamadas a procedimientos Tcl, así que los parámetros pueden ser pasados sin copia. Las constantes son también compartidas. Esto quiere decir que una referencia a un objeto a través de objv debe de tener una o más referencias. Tcl_IsShared devuelve uno si hay mas de una referencia a un objeto. Si un comando modifica un objeto compartido, se creará una copia privada con Tcl_DuplicateObj.
Tcl_Main y Tcl_AppInit
La librería Tcl soporta la estructura de una aplicación básica a través del procedimiento Tcl_Main que esta diseñado para ser llamado desde tu programa main. Tcl_Main hace tres cosas:
Llama a Tcl_CreateInterp para crear un interprete que incluya todos los comandos Tcl estándar como set y proc. También define unas pocas variables como argc y argv. Estas poseen los argumentos que se le pasan a tu aplicación.
Llama a Tcl_AppInit, el cual no forma parte de la librería Tcl. En cambio, tu aplicación provee este procedimiento. En Tcl_AppInit puedes registrar comandos Tcl de aplicaciones especificas.
Lee un script o se introduce dentro de un bucle interactivo.
El programa main llama a Tcl_Main con los parámetros argc y argv pasados al programa. Estas son las cadenas pasadas al programa en la línea de comandos, Tcl_Main almacenara estos valores en variables Tcl con el mismo nombre. Tcl_Main también de la dirección del procedimiento de iniciación.
Tk_Main
La estructura de las aplicaciones en Tk es similar. El procedimiento Tk_Main crea un intérprete de Tcl y la ventana main del Tk. Llama a un procedimiento para conseguir una completa inicialización. Después vuelve Tk_AppInit, Tk_Main entra en un bucle hasta que todas las ventanas de la aplicación sean destruidas.
El Bucle
Un bucle se usa para procesar eventos de sistemas de ventanas y otros eventos como relojes y conectores de redes locales. Todas las aplicaciones Tk deben de tener bucles para que funciones correctamente en el sistema de ventanas.
Tk provee un bucle estándar con el procedimiento Tk_MainLoop, el cual se llama al final del Tk_Main. La shell del wish proporciona un bucle automáticamente. La shell de tclsh no, además se puede añadir un bucle usando Tcl puro.
Tu puedes proporcionar a la aplicación de tu propio bucle. En este caso debes llamar al procedimiento Tcl_DoOneEvent para procesar todos los eventos Tcl pendientes. De vez en cuando el mejor camino para tratar bucles es registrar controladores para los diferentes eventos y usar Tk_Main. Existen cuatro clases de eventos, las cuales son controladas por las siguientes órdenes de Tcl_DoOneEvent.
Eventos de ventanas. Usar el procedimiento Tk_CreateEventHandler para registrar un controlador para estos eventos. Usar la señal TCL_WINDOW_EVENT para procesarlos en Tcl_DoOneEvent.
Eventos de archivos. Usar estos eventos para esperar en periféricos lentos y conexiones de redes locales. Se debe de usar la señal TCL_FILE_EVENTS para procesar estos eventos.
Eventos de reloj. Se pueden configurar eventos para que sucedan después de un período de tiempo específico. Usar el procedimiento Tcl_CreateTimerHandler para registrar un controlador para el evento. Usar la señal TCL_TIMER_EVENTS para procesarlos en Tcl_DoOneEvent.
Eventos parados. Se procesan cuando no hay nada mas que hacer. Virtualmente, todos los widgets Tk usan eventos parados para visualizarse ellos mismos. Usar el procedimiento Tcl_DoWhenIdle para registrar un procedimiento para llamar inmediatamente al siguiente evento. Usar la señal TCL_IDLE_EVENTS para procesar éstos en Tcl_DoOneEvent.
Invocación de scripts desde C
El programa main no es el único lugar en el que puedes evaluar scripts Tcl. Puedes usar el procedimiento Tcl_Eval esencialmente para evaluar en todo momento comandos Tcl:
Tcl_Eval (Tcl_Interp *interp, char *command);
Esto es como un comando asociado a un botón que es invocado. El único inconveniente es que el script es el que debe de destruir el widget o el comando Tcl que lo invocó. Los procedimientos Tk_Preserve, Tk_Release, y Tk_EventuallyFree pueden ser usados para controlar cualquier estructura de datos asociada al widget o comando Tcl.
Se debe de ser cuidadoso porque Tcl_Eval puede modificar la cadena que se le pasa al procedimiento. Si pasas una constante cadena al Tcl_Eval asegúrate que el compilador no la coloca en memoria de sólo lectura.
Existen unas pocas variaciones de Tcl_Eval. El procedimiento Tcl Tcl_GlobalEval es como Tcl_Eval pero evalúa en el ámbito global. Tcl_Eval usa el ámbito corriente para acceder a variables locales. El procedimiento Tcl_VarEval toma el numero de una variable de una cadena de argumentos y os concatena antes de la siguiente comprobación:
Tcl_VarEval (Tcl_Interp *interp, char *str, ..., NULL);
Tcl_EvalObj y Tcl_GlobalEvalObj toman un objeto como un argumento sacado de una simple cadena. La cadena se compila la primera vez que se utiliza. Si se va a utilizar el script varias veces, entonces el objeto la recupera automáticamente.
Tablas
Secuencia de caracteres especiales
\a | Campana: \07 |
\b | Espacio atrás |
\f | Avance de línea |
\n | Nueva línea |
\r | Retorno |
\t | Tabulador |
\v | Tabulador vertical |
\<intro> | Reemplaza intro y espacios por un simple espacio |
\\ | Contrabarra |
\ooo | Numero en octal |
\xhh | Numero en hexadecimal |
\c | Reemplaza por el carácter c si e no es ninguno de los anteriores |
Operadores.
-,~,! | Menos unario, NOT a nivel de bit, NOT lógico |
1, % | Multiplicar, dividir, resto |
+,- | Suma, resta |
<<,>> | Bit a izquierda, bit a derecha |
<,>,<=, >= | Menor, Mayor, menor o igual, mayor o igual |
= =,!= | Igual, No igual |
& | AND a nivel de bit |
^ | NOT a nivel de bit |
| | OR a nivel de bit |
&& | AND lógico |
|| | OR lógico |
x?y:z | Si x y sino z |
Funciones Matemáticas importantes.
abs (x) | Valor absoluto de x |
acos (x) | Arcocoseno |
asin (x) | Arcoseno |
ceil (x) | Mayor entero más próximo a x |
cos (x) | Coseno |
double (x) | Convierte x a coma flotante |
exp (x) | Exponencial de base e (ex) |
floor (x) | Menor entero más próximo a x |
fmod (x, y) | Resto de x entre y en coma flotante |
int (x) | Parte entera |
1og (x) | Logaritmo neperiano (Ln x) |
log10 (X) | Logaritmo base 10 |
pow (x, y) | X elevado a y (xy) |
(continuación)
round (x) | Redondea x a entero |
sin (x) | Seno |
sqrt (x) | Raíz cuadrada |
tan (x) | Tangente de x |
Lista de órdenes
append | Añade argumentos a una variable |
array | Operaciones con una matriz |
break | Finaliza un bucle |
catch | Captura errores |
cd | Cambia de directorio de trabajo |
close | Cierra un fichero |
concat | Concatena argumentos; introduce un espacio en blanco |
continue | Continua con la siguiente iteración de un bucle |
error | Simula un error |
eof | Chequea el fin de fichero |
eval | Concatena argumentos y los evalúa como una orden |
exec | Ejecuta programas externos |
exit | Termina el proceso |
Expr | Evalúa una exp esión matemática |
fi1e | Consulta el sistema de ficheros |
f1ush | Vacía el buffer de I/0 |
for | Ejecuta un bucle un número de veces |
foreach | Ejecuta un bucle para una lista de valores |
format | Formatea una cadena para una presentación |
gets | Lee una línea de un fichero abierto |
globs | Expande un patrón para búsqueda de nombres de ficheros |
global | Declara variables globales |
history | Controla la línea de ordenes |
if | Ejecución condicional |
incr | Incrementa una variable en un valor entero |
info | Consulta el estado M interprete W |
join | Concatena elementos de listas con un separador |
lappend | Añade elementos al final de una lista |
1index | Busca un elemento de una lista |
linsert | Inserta elementos en una lista |
list | Crea una lista con los argumentos |
llength | Da el número de elementos de una lista |
lrange | Retomo un rango de elementos de una lista |
lreplace | Reemplaza elementos de una lista |
lsearch | Busca elementos de una lista según un patrón |
Isort | Ordena elementos de una lista |
open | Abre un fichero |
pid | Da el identificador de un proceso |
proc | Permite definir un procedimiento |
puts | Escribe una cadena en un fichero |
(continuación)
pwd | Da el directorio actual |
read | Lee bloques de caracteres de un fichero |
regexp | Estudia coincidencias por medio de expresiones regulares |
regsub | Realiza sustituciones basándose en expresiones regulares |
rename | Renombre procedimientos |
return | Devuelve valores desde un procedimiento |
scan | Busca valores en expresiones formateadas |
seek | Activa el índice de un fichero |
set | Asigna valores a una variable |
source | Ejecuta orden Tcl como fichero externo |
split | Convierte una cadena en una lista |
string | Opera con cadenas |
switch | Elección múltiple |
tell | Retorna el valor de un índice de un fichero |
time | Mide el tiempo de ejecución de un comando |
trace | Monitoriza variables |
unknown | Gestor de ordenes desconocidas |
unset | Elimina la definición de una variable |
uplevel | Ejecuta una orden en un nivel diferente |
upvar | Referencia a una variable en un nivel distinto |
while | Construye un bucle |
Introducción a Tk.
Las interfaces de usuario de un programa determinan la comunicación del mismo con el usuario, con Tk podemos crear fácilmente interfaces de usuario gráficas, se trata de un toolkit que permite construir todos los elementos de las interfaces de forma rápida y sencilla. El programador dispone de menús, botones, ventanas, etc. listos para usar sin necesidad de programar directamente toda la GUI(Graphical User Interface).
Enlaces (Binds), la Base de la Programación de las GUI's
Las Interfaces de Usuario Gráficas interactivas son muy importantes en un programa. Sin embargo, a la hora de programar una GUI el programador debe cambiar su forma de concebir el programa. En un programa tradicional, el flujo de ejecución está perfectamente determinado desde el comienzo de la ejecución hasta el final de la misma, el programador debe diseñar ese flujo de ejecución dirigiendo al usuario hacia la solución. Sin embargo en un programa que incorpora unir GUI, es el usuario el que conduce el programa, por tanto, el flujo de ejecución no viene determinado por el programa sino por su usuario.
El programador debe diseñar las instrucciones que construyen los elementos de la interfaz, y para cada uno de ellos programar aquellas acciones que deban ejecutarse cuando el usuario actúe sobre él.
El flujo de ejecución depende del usuario, por ello el programador lo que debe hacer es preparar los elementos de la interfaz para que puedan responder a las acciones del usuario. Ello se consigue mediante los enlaces o binds.
Tk, la extensión de Tcl para generar GUI's
Tk es una extensión de Tcl que permite crear interfaces de usuario gráficas por medio de aplicaciones Tcl. Tk añade a las órdenes de Tcl otras órdenes adicionales para la creación de elementos gráficos denominados widgets. Además permite la interacción entre widgets por medio de lo que se denominan controladores geométricos.
Además de las ventajas de las GUI's expuestas en el apartado anterior, Tk aporta la posibilidad de manipular objetos gráficos tales como imágenes, líneas, polígonos, arcos, etc., usando la misma filosofía que se usa para el resto de elementos de la GUI. Esto facilita aun más la tarea de programar aplicaciones gráficas, ya que la salida gráfica también se realiza usando órdenes de muy alto nivel, fáciles de aprender y de usar.
Wdigets más importantes.
Frame
Las widgets de la clase frame son las widgets más sencillas. Son regiones rectangulares coloreadas, y pueden tener bordes con efectos en 3D Se suelen usar como contenedores de otros grupos de widgets y pueden servir para añadir decoraciones como bloques de color o bordes con efectos 3D alrededor de un grupo de widgets. Las widgets de la clase frame no tienen comportamiento por defecto, normalmente no responden al ratón o al teclado.
La creación de una widget de la clase frame se realiza mediante la orden de clase frame que tiene la siguiente sintaxis:
frame pathName ?options?
donde pathName es el nombre que se quiere dar a la nueva widget y options son las opciones de configuración. Los símbolos de interrogación, ? indican que las opciones son opcionales, es decir, pueden especificarse o no. En este último caso se toma el valor por defecto para dicha opción.
Ejemplo de frame.
Opciones de Configuración Especificas de las Widgets frame
En las widgets de la clase f rame están disponibles las siguientes, opciones de configuración estándar
-borderwidth | -cursor |
-highlightbackground | -highlightcolor |
-highlightthickness | -relief |
-takefocus |
Además de las opciones estándar están disponibles las siguientes opciones propias de la clase de widget frame:
-background
Esta opción se comporta igual que la opción estándar -background excepto que en su valor se puede especificar la cadena vacía. En este caso, la widget no visualizará fondo ni borde y no se consumirán colores de la paleta (colormap) para ellos.
-class
Especifica una clase para la ventana. Esta clase se usa para acceder a la base de datos de opciones y para otros propósitos tales como enlaces.
Esta opción no se puede cambiar con la orden de widget configure.. La única forma de cambiar la opción -class es destruir la widget y volver a crearla con el nuevo valor que se desee.
-colormap
Un mapa de color o paleta es una proyección que hace corresponder tina representación de color con el valor usado por el hardware para general ese color en el monitor. Depende de la profundidad de color, es decir, de¡ número de bits que se usan para codificar el color de cada pixel y del valor de la opción de configuración -visual. Normalmente una widget hereda el mapa de color de su widget padre. -colormap puede tomar dos valores: new, o bien un nombre de ventana. En el primer caso la widget creará su propio mapa de color, y en el segundo lo compartirá con otra a ventana ya creada. Si no se especifica la opción -colormap la widget usa el mismo color que la ventana padre.
-height
Especifica la altura que se desea para la widget expresada en unidades de pantalla.
Ordenes de Widget para las Widgets frame
pathName cget option
Donde pathName es el nombre de la orden de widget; y option debe ser alguna de las opciones disponibles en widgets de la clase frame Esta orden de widget devuelve el valor actual de la opción de configuración que se pasa como argumento en option.
pathName configure ?option? ?value option value ?
Permite modificar u obtener el valor actual de las opciones de configuración de la widget. Si no se especifica ninguna opción, la orden de widget devuelve una lista con todas las opciones de configuración de la widget cuyo nombre es pathName Si se especifica una opción pero no un valor para ella, entonces la orden devuelve el valor actual para esa opción de configuración. Por último, si se especifican una o más parejas option value, entonces la orden modifica el valor actual de la opción que se indica en opt ¡un la cual pasa a tener el valor que se indica en value
Las opciones que se pueden usar en esta orden de widget son sólo aquellas disponibles para widgets de la clase frame.
Label
Una widget de la clase label es similar a una widget de la clase frame. Se distingue en que en su interior puede mostrar un texto o un mapa de bits. Tiene, por tanto, algunas opciones de configuración distintas a las widgets frame, con las que se indica qué se debe visualizar en la widget.
La opción más importante es la relativa al texto a visualizar. Con la opción -text texto se visualiza el texto que se indica mientras que con la opción -textvariable variable se visualiza el contenido de la variable, actualizando la widget cada vez que se modifica el valor de la variable. El texto puede ocupar varios renglones, pero sólo se puede usar un único tipo de letra.
Las widgets label pueden mostrar mapas de bits en lugar de texto. Para que una widget label muestre un mapa de bits en lugar de un texto, se usa la opción de configuración -bitmap.
Para crear una widget de la clase label se usa la orden de clase label que tiene la siguiente sintaxis:
label pathName ?options?
Opciones de Configuración Específicas de las Widgets label
En las widgets de la clase label están disponibles las siguientes opciones de configuración estándar
-anchor | -background |
-borderwidth | -bitmap |
-cursor | -font |
-foreground | -highlightbackground |
Highhtlightcolor | Highlightthichickness |
-image | -justify |
-padx | -pady |
-relief | -takefocus |
-text | -textvariable |
-underline | -wrapelength |
Otras opciones disponibles son:
-height
Especifica la altura que se desea para la widget. Si en la widget 1abe1 se visualiza una imagen o un mapa de bits el valor se expresa en unidades de pantalla.. Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto. Si no se especifica esta opción, la altura de la widget label se calcula en función de la imagen, mapa de bits o texto que vaya a visualizarse.
-Width
Especifica la anchura que se desea para la widget. Si en la widget label se visualiza una imagen o un mapa de bits, el valor se expresa en unidades de pantalla. Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto. Si no se especifica esta opción, la anchura de la widget label se calcula en función de la imagen, mapa de bits o texto que vaya a visualizarse.
Ordenes de Widget para las Widgets label
pathName cget option
Donde pathName es el nombre de la orden de widget, que debe ser igual al nombre de una widget label ya creada; y option debe ser alguna de las opciones disponibles en widgets de la clase lahpl.Esta orden de widget devuelve el valor actual de la opción de configuración que se pasa como argunento en option.
pathName configure ?option? ?value option value...?
Permite modificar u obtener el valor actual de las opciones de configuración de la widget. Las opciones que se pueden usar en esta orden de widget son sólo aquellas disponibles para widgets de la clase label.
Ejemplos de Uso
En el siguiente ejemplo se ilustra el funcionamiento de las widgets de las clases label y toplevel. En él se usa procedimiento watch para visualizar el valor de una variable:
proc watch name
topleve1.watch
label.watch.label -text, "valor
de\"$name\":"
label watch.value -textvariable $name
pack.watch.label.watch.value -side left
El procedimiento crea una widget toplevel y dos de la clase 1abel. que se ordenan una al lado de la otra, dentro de la primera, para visualizar el nombre de una variable y su contenido.
Button
Una widget de la clase button tiene todas las prestaciones de las widgets de la clase label y además es capaz de responder a las pulsaciones del ratón. Cuando el cursor se mueve sobre un botón, éste se resalta para indicar que algo pasará si se pulsa un botón del ratón. Se dice que un botón en este estado está activo. Esta es una característica de Tk, las widgets se resaltan cuando el cursor pasa sobre ellas y están preparadas para responder a pulsaciones del ratón.
Cuando se pulsa el botón izquierdo cuando una widget button está activa, su apariencia cambia para que parezca hundida como si se hubiese pulsado un botón real. Cuando se suelta el botón del ratón se restablece su apariencia normal. Además, cuando se suelta el botón del ratón se evalúa la opción -command como un guión Tcl. De esta forma es posible ejecutar acciones cuando el usuario pulsa el botón izquierdo del ratón sobre una widget button.
Para crear una widget de la clase button se usa la orden de clase button que tiene la siguiente sintaxis:
button pathName ?options?
Opciones de Configuración Específicas de las Widgets button
En las widgets de la clase button están disponibles las siguientes opciones de configuración:
-actíveforeground | -activebackground |
-anchor | -background |
-bitmap | -borderwidth |
-cursor | -dísabledforeground |
-font | -foreground |
-highllghtbackground | -highlíghtcolor |
-highlíghtthickness | -ímage |
-justify | -padx |
-pady | -relief |
-takefocus | -text |
-textvariable | -underline |
-wraplength |
Otras opciones disponibles:
command
Especifica la orden Tcl que se asocia con la widget button. esta orden se invoca cuando el usuario hace clic con el botón izquierdo del ratón sobre la widget. La orden Tcl que se asocia puede ser un procedimiento o un guión Tcl
-height
Especifica la altura que se desea para la widget. Si en la widget button se visualiza una imagen o un mapa de bits, el valor se expresa en unidades de pantalla. Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto.Si no especifica esta opción, la altura de la Widget button se calcula en función de la imágen, mapa de bits o texto que vaya a visualizarse.
-state
Especifica uno de los siguientes estados para el botón: normal, activo, inhabilitado. En estado normal el botón se visualiza usando los colores especificados en las opciones -foreground y -background. El estado activo se da cuando el cursor está sobre el botón. En este caso el botón se visualizará usando los colores especificados opciones -activeforeground y -activebackground. El estado inhabilitado significa que el botón no puede utilizarse, se ignoran las pulsaciones de ratón y teclado. Cuando una widget button se encuentra en este estado, se dibuja usando los colores que se especifican en las opciones -disabledforeground y -backgrourid.
-width
Especifica la anchura que se desea para la widget. Si en la widget button se visualiza una imagen o un mapa de bits, el valor se expresa en unidades de pantalla. El valor puede tener cualquiera de las formas descritas en el apartado 10.2 "Opcionesde Distancia". Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto. Si ¡lo se especifica esta opción, la anchura de la widget bu tton se calcula en función de la imagen, mapa de bits o texto que vaya a visualizarse.
Ordenes de Widget para las Widgets button
pathName cget option
Donde pathName es el nombre de la orden de widget, que debe ser igual al nombre de una widget button ya creada; option debe ser alguna de las opciones disponibles en widgets de la clase button. Esta orden de widget devuelve el valor actual de la opción de configuración que se pasa como argumento en option.
pathName configure ?option? ?value option value...?
Permite modificar u obtener el valor actual de las opciones de configuración de la widget. Si no se especifica ninguna opción, la orden de widget devuelve una lista con todas las opciones de configuración de la widget cuyo nombre es pathName. Si se especifica una opción pero no un valor para ella, entonces la orden devuelve el valor actual para esa opción de configuración. Por último, si se especifican una o más parejas option value entonces la orden modifica el valor actual de la opción que se indica en option la cual pasa a tener el valor que se indica en value.
pathName flash
Hace que la widget button parpadee. Ello se consigue redibujando el botón varias veces, alternando los colores correspondientes a los estados activo y normal. Después de ejecutar esta orden de widget el botón queda en el estado (normal o activo) que tuviese cuando se llamó a la orden. Esta orden no tiene ningún efecto si el botón está inhabilitado.
pathName invoke
Invoca la orden Tcl asociada a la widget button si la hay, como si el usuario hubiese hecho clic con el botón izquierdo M ratón sobre ella. El valor que se devuelve es el valor devuelto por la orden Tcl o la cadena vacía si no hay ninguna orden asociada con esa widget.
Enlaces por Defecto
Tk crea automáticamente varios enlaces por defecto para las widgets de la clase button que le dan su comportamiento por defecto:
<Enter> y <Leave>
Una widget de la clase button se activa siempre que el ratón entra en ella y se desactiva cuando el ratón sale de ella.
<ButtonPress-1> y <ButtonRelease-1>
El efecto 3D del borde de un botón cambia a modo sunken (hundido) siempre que se pulse el botón izquierdo sobre él, y se devuelve a su valor original cuando se suelta. Además si se suelta dentro del área del botón, entonces se invoca la orden asociada al mismo.
<KeyPress-space> y <KeyPress-Return>
Cuando un widget button es la widget focus la pulsación de la barra espaciadora o la tecla Return produce que el botón se invoque.
Ninguno de los enlaces descritos tiene efecto si la widget se encuentra en estado inhabilitado.
Ejemplo.
Checkbutton
Las widgets de la clase checkbutton se usan para hacer elecciones binarias, como por ejemplo: activar o desactivar el modo de subrayado. Es similar a1 widget button excepto en dos cosas: cuando se pulsa el botón izquierdo del ratón sobre un checkbutton cambia el valor una variable global de 0 a 1 ó de 1 a 0. El nombre de dicha variable se indica mediante la opción de configuración -variable. Además, a la izquierda del texto aparece un indicador rectangular que se muestra en color oscuro ó vacío dependiendo del valor de la variable. Si la variable tiene valor 1 aparece en color oscuro y si tiene valor 0 aparece vacío.
Cada widget checkbutton comprueba el valor de la variable que tiene asociada y si el valor de ésta cambia, por ejemplo con motivo de una orden set , el checkbutton actualiza la forma en que se dibuja el indicador para reflejar el cambio. Se puede modificar el color del indicador, o cambiar los valores correspondientes a los estados seleccionado y de-seleccionado en lugar de los valores preestablecidos 1 y 0.
Para crear un checkbutton se usa la orden de clase checkbutton:
checkbutton pathName ?options?
Opciones de Configuración Específicas de las Widgets checkbutton
-activeforegroun | -activebackground |
-anchor | -background |
-bitmap | -borderwidth |
-cursor | -disabledforeground |
-foreground | -highlightbackground |
-highlightcolor | -highlightthickness |
-image | -justify |
-padx | -pady |
-relief | -takefocus |
-text | -font |
-textvariable | -underline |
-wraplength |
Otras ordenes son:
-command
Especifica la orden Tcl que se asocia con la widget checkbutton .Esta orden se invoca cuando el usuario hace clic con el botón izquierdo del ratón sobre el checkbutton La orden Tcl que se asocia puede ser un procedimiento o un guión Tcl. La variable global asociada al checkbut ton mediante la opción -variable se actualiza antes de invocar la orden Tcl asociada.
-height
Especifica la altura que se desea para la widget. Si en la widget checkbutton se visualiza una imagen o un mapa de bits, el valor se expresa en unidades de pantalla. Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto. Si no se especifica esta opción, la altura de la widget checkbutton se calcula en función de la imagen, mapa de bits o texto que vaya a visualizarse.
-indicatoron
Especifica si se visualizará o no el indicador que aparece en la widget. El valor debe ser true o false. Si se indica un valor false se ignora la opción -relief y se usa el valor sunken si el checkbutton está seleccionado o el valor raised si no lo está
-offvalue
Valor que toma la variable Tcl asociada al checkbutton cuando éste no está seleccionado. El valor por defecto es 0.
-onvalue
Valor que toma la variable Tcl asociada al checkbutton cuando éste esta seleccionado. El valor por defecto es 1.
-selectcolor
Especifica el color de fondo a usar cuando el checkbutton está seleccionado Si ti en la opción -indicatoron tiene valor true este color se aplica al indicador y si el valor es false se aplica a toda la widget cuando el checkbutton esta seleccionado, en lugar de los colores indicados en las opciones - background y -activebackground.
-selectimage
Especifica una imagen que se visualiza en lugar de la imagen dada en la opción image cuando el checkbutton está seleccionado. Esta opción se ignora si no se ha especificado la opción - image
-state
Especifica uno de los siguientes estados para el checkbutton: normal, activo o inhabilitado. En estado normal el botón se visualiza usando los colores especificados en las opciones -foreground yel estado activo se da cuando el cursor esta sobre el botón. En este caso el botón se visualizará usando los colores especificados en las opciones -activeforeground y -activebackground.
El estado inhabilitado significa que el botón no puede utilizarse, se ignoran las pulsaciones de ratón y teclado. Cuando una widget checkbutton se encuentra en este estado, se dibuja usando los colores que se especifican en las opciones -disabledforeground y -background.
-variable
Indica el nombre de la variable global que se asocia al checkbutton El valor de esta variable cambia cuando el usuario selecciona el botón (toma el valor especificado con la opción -onvalue, ó 1 si no se ha especificado ninguno), ó
deselecciona (toma el valor especificado en la opción -offvalue ó 0 si no se ha especificado ninguno).
Si no se usa la opción -variable, automáticamente se asocia una variable global cuyo nombre es el nombre de la widget a partir del último punto.
-width
Especifica la anchura que se desea para la widget. Si en la widget checkbutton se visualiza una imagen o un mapa de bits, el valor se expresa en unidades de pantalla. Por el contrario, si en la widget se visualiza texto, el valor se expresa en líneas de texto. Si no se especifica esta opción, la anchura de la widget checkbutton se calcula en función de la imagen mapa de bits o texto que vaya a visualizarse.
Ordenes de Widget para las Widgets checkbutton
pathName cget option
Donde pathName es el nombre de la orden de widget, que debe ser igual al nombre de una widget checkbutton ya creada: y option debe ser alguna de las opciones disponibles en widgets de la clase checkbutton Esta orden de widget devuelve el valor actual de la opción de configuración que se pasa como argumento en option.
pathName configure ?option? ?value option value...?
Permite modificar u obtener el valor actual de las opciones de configuración de la widget. Si no se especifica ninguna opción, la orden de widget devuelve una lista con todas las opciones de configuración de la widget cuyo nombre es pathName. Si se especifica una opción pero no un valor para ella, entonces la orden devuelve el valor actual para esa opción de configuración. Por último si se especifican una o más parejas option va1ue entonces la orden modifica el valor actual de la opción que se indica en option la cual pasa a tener el valor que se indica en va. Las opciones que se pueden usar en esta orden de widget son sólo aquellas disponibles para widgets de la clase checkbutton.
pathName deselect
Deselecciona el checkbutton y actualiza su variable asociada asignándole el valor especificado en la opción -offvalue.
pathName flash
Hace que la widget checkbutton parpadee. Ello se consigue redibujando el botón varias veces, alternando los colores correspondientes a los estados activo y normal. Después de ejecutar esta orden de widget el botón queda en el estado (normal o activo) que tuviese cuando se llamó a la orden. Esta orden no tiene ningún efecto si el botón está inhabilitado.
pathName invoke
Invoca la orden Tcl asociada a la widget checkbutton, si la hay, como si el usuario hubiese hecho clic con el botón izquierdo del ratón sobre ella. El valor que se devuelve es el valor devuelto por la orden Tclo la cadena vacía si no hay ninguna orden asociada con esa widget.
pathName select
Selecciona el checkbutton y actualiza la variable asociada a este asignándole el valor especificado en la opción -onvalue.
pathName toggle
Cambia el estado del checkbutton. Si estaba seleccionado lo deselecciona y viceversa. Además redibuja la widget para que se muestre de acuerdo al nuevo valor y modifica la variable asociada.
Enlaces por Defecto
<Enter> y <Leave>
Una widget de la clase checkbutton se activa siempre que el ratón entra en ella y se desactiva cuando el ratón sale de ella.
<ButtonPress-1>
Cuando se pulsa el botón izquierdo del ratón sobre un checkbutton, éste se invoca (su estado cambia de seleccionado a seleccionado o viceversa y si tiene alguna orden asociada se ejecuta).
<KeyPress-space> y <KeyPress-return>
Cuando una widget checkbutton es la widget focus, la pulsación de la barra espaciadora o la tecla Return produce que el botón se invoque.
Ninguno de los enlaces descritos tiene efecto si la widget se encuentra en estado inhabilitado.
Radiobutton
Las widgets de la clase radiobutton proporcionan una forma para seleccionar tino de varios valores posibles. Las widgets radiobutton trabajan en grupo. Varias de ellas controlan una única variable global. En la definición de la widget se indica el nombre de la variable asociada y el valor que se debe asignar a esa variable cuando se seleccione el radiobutton. Cada widget muestra un indicador en forma de diamante a la izquierda de texto o mapa de bits que se resalta cuando se hace clic en el radiobutton y vuelve a su estado normal cuando se hace clic sobre otro del grupo. Como es natural, sólo una widget radiobutton de entre todas las que forman un mismo grupo puede estar resaltada a la vez.
Para crear una widget de la clase radiobutton se usa la orden de clase radiobutton que tiene la siguiente sintaxis:
radiobutton pathName ?options?
donde pathName es el nombre que se quiere dar a la nueva widget y options son las opciones de configuración.
Los símbolos de interrogación, ?, indican que las opciones son opcionales, es decir, pueden especificarse o no. En este último caso se toma el valor por defecto para dicha opción.
Opciones de Configuración Específicas de las Widgets radiobutton
Opciones de configuración estándar:
-actíveforeground | -activebackground |
-anchor | -background |
-bitmap | -borderwidth |
-cursor | -disabledforeground |
-font | -foreground |
-highlightbackground | -híghlightcolor |
-híghlightthickness | -ímage |
-justify | -padx |
-pady | -relief |
-takefocus | -text |
-textvariable | -underline |
-wraplength |
Ejemplos de Radiobutton y Checkbutton
Menús
Las widgets de la clase menú crean una widget que puede visualizar una colección de entradas, cada una de las cuales ocupa una sola línea, y que pueden tener diferente aspecto y propiedades. En una misma widget de la clase menu se pueden combinar widgets de distintos tipos para construir un único menú.
Cada una de las entradas de una widget de la clase menu debe ser de alguno de los siguientes tipos
-command
La entrada es similar a una widget de la clase button. Muestra una cadena de texto o un mapa de bits e invoca a un guión Tcl cuando se pulsa el botón 1 del ratón sobre ella.
-checkbutton
La entrada es similar a una widget de la clase checkbutton. Muestra un cadena de texto y tiene una variable asociada que tomará los valores 0 o 1.
-radiobutton
Es similar a una widget radiobutton. Muestra una cadena de texto y tiene asociado un valor que es el que se asigna a una variable, cuando la entrada radiobutton está seleccionada en el menú.
-cascade
Permite asociar un submenú a una entrada de menú. Cuando el cursor pasa sobre una entrada de tipo cascade, entonces se muestra el submenú asociado.
-separator
Muestra una línea horizontal en el menú. Permite clasificar las distintas entradas de una widget de la clase menu para que el usuario del programa las localice facilmente.
Opciones de Configuración Específicas de las Widgets menu
En las widgets de la clase menu están disponibles las siguientes opciones de configuración estándar
-actívebackground | -disabledforeground |
-actíveborderwidth | -font |
-actíveforeground | -foreground |
-background | -relief |
-borderwidth | -takefocus |
-cursor |
Opciones propias de la clase de widget menu:
-postcommand
Esta opción de configuración permite indicar un guión Tcl que se ejecutará cada vez que se muestre el menú en la pantalla.
-Selectcolor
Indica el color que se va a mostrar en el indicador que se muestra en entradas de tipo checkbutton o radiobutton.
Ordenes de Widget para las Widgets menu
Muchas de las órdenes de widget que se pueden aplicar a las widgets Menu permiten manipular las entradas que se muestran en dicha widget, para lo es necesario indicar uno o más argumentos que se refieren a una determinada entrada. Las entradas se identifican mediante un número que se denomina índice.
Existen diversas formas para especificar un índice, incluyendo nombres simbólicos que permiten identificar de forma sencilla determinadas posiciones especiales.
número
Indica la entrada que ocupa la posición que indica el número, teniendo en cuenta que la primera línea del menú ocupa la posición
active
Se refiere a la entrada de la widget de la clase menu que esté activada en ese momento.
end
Se refiere a la última entrada en la widget. La que ocupa la posición más inferior en la lista.
none
Indica ninguna entrada. Tiene utilidad cuando se usa junto con la orden de widget activate ya que permite desactivar todas las entradas del menú de forma sencilla.
number
El valor dado en number se trata como una coordenada y medida dentro de la ventana que contiene a la widget menu Se refiere a la entrada mas cercana a la posición indicada por dicha coordenada y.
pattern
El valor dado en pattern es una patrón de búsqueda, de forma que se refiere a la primera entrada de] menú que satisfaga a dicho patrón.
Las órdenes de widget para una widget de la clase menu son
pathName activate index
Resalta la entrada indicada mediante el valor index.
pathName cget option
Devuelve el valor de la opción de configuración especificada en el arguniento option.
pathName configure ?option ? ?value option value ?
Consulta o modifica el valor de una opción de configuración.
pathName delete index1 ?index2 ?
Borra las entradas del menú desde la indicada por index1 a la indicada por index2
pathName index index
Devuelve el valor numérico correspondiente a la entrada especificada por el valor index.
pathName type index
Devuelve el tipo correspondiente a la entrada especificada por el valor index
Normalmente los menús se usan con estilo "desplegable". En este estilo, aplicación muestra una barra de menús en la parte superior de la ventana principal Cuando el usuario pulsa el botón 1 del ratón sobre un botón de menú, el menú asociado se “despliega” bajo el botón. Entonces el usuario puede deslizar el ratón sobre el menú para elegir la opción que desee.
Las widgets de tipo menubutton son un tipo especial de widgets a las que se puede asociar widgets menu automáticamente.
Scrollbars
Las widgets de la clase scrollbar controlan la forma en que se muestran otras widgets. Se pueden asociar con widgets 1 listbox entry, text ó canvas. El movimiento del ratón sobre la widget scrollbar afecta a la visualización en la widget asociada.
Los elementos de una widget scrollbar son cinco: arrow1 y arrow2 que son las flechas que se encuentran a ambos extremos de la barra de scroll; slider que representa la posición y tamaño relativos de la información mostrada en la widget asociada a la barra de scroll con respecto a la posición y tamaño globales; y trough1 y trough2, que son las zonas que quedan entre el slider y las flechas.
Una widget scro11bar interactúa con la widget que tiene asociada por medio de guiones Tcl. Las ordenes -yscrolicommand y -xscrolicommand se usan en la widget asociada para actualizar la información cuando se produce un cambio en la barra de scroll, y la opción -command se usa en la widget scrollbar para notificar los cambios a la widget asociada.
Para crear una widget de la clase scrollbar se usa la orden de clase scrollbar que tiene la siguiente sintaxis:
scrolIbar pathName ?options?
donde pathName es el nombre que se quiere dar a la nueva widget y options son las opciones de configuración. Los símbolos de interrogación, ?, indican que las opciones son opcionales, es decir, pueden especificarse o no. En este último caso se toma el valor por defecto para dicha opción.
Opciones de confuguración específicas de las Widgets scrollbar
En las widgets de la clase scrollbar están disponibles las siguientes opciones de configuración
estándar :
-actívebackground | -background |
-borderw¡dth | -cursor |
-highlightbackground | -híghlíghtcolor |
(continuación)
-highllghtthícknese | -Jump |
-orient | -relief |
-repeatdelay | -repeatínterval |
-takefocus | -troughcolor |
Además de las opciones estándar están disponibles las siguientes:
-activerelief
Efecto 3D del slider y de las flechas de la barra de scroll cuando el cursor está sobre ellas. Los valores posibles son: flat,raised, groove, y ridge.
-command
Especifica el prefijo de una orden Tcl que debe ser invocada cuando se cambia la widget scrollbar. Habitualmente será una operación xview o yview.
-elementbordezwídth
Especifica la anchura del borde que se dibuja alrededor de los elementos intemos de la barra de scroll (flechas, y slider).
-wldth
Especifica la anchura de la barra de scroll. En barras de scroll horizontales es la altura de la barra, y en barras verticales es la anchura de la barra.
Toplevel
Este tipo de widgets son idénticas a las widgets de la clase frame con la diferencia de que ocupan ventanas de nivel superior, mientras que las widget frame ocupan ventanas interiores. Normalmente se usan como ventanas padre para cuadros de diálogo o cuadros de herramientas, y como widget principal para una aplicación. Cuando se crea una nueva widget de la clase topLevel se puede usar la opción de configuración -screen para especificar la pantalla en la que se va a dibujar.
Para crear una widget de la clase topleve1 se usa la orden de clase top1eve1 que tiene la siguiente sintaxis:
toplevel pathName ?options?
donde pathName es el nombre que se quiere dar a la nueva widget y options son las opciones de configuración. Los símbolos de interrogación ? indican que las opciones son opcionales, es decir, pueden especificarse o no. En este último caso se torna el valor por defecto para dicha opción.
Opciones de Configuración Específicas de las Widgets toplevel
En las widgets de la clase top1evel están disponibles las siguientes opciones de configuración estándar:
-borderwidth | -cursor |
-highlightbackground | -highlightcolor |
-highlightthickeness | -relief |
-takefocus |
Además de las opciones estándar están disponibles las siguientes opciones para la clase de widget :
-background
Esta opción se comporta igual que la opción estándar background excepto que en su valor se puede especificar la cadena vacía. En este caso la widget no visualizará fondo ir¡ borde y ni) se consumiran colores de la paleta (colormap) pala ellos.
-class
Especifica unir clase para la ventana. Esta clase se usa para acceder a la base de datos de opciones y para otros propósitos tales corno enlaces.
-colormap
La opción -colormap puede tomar dos valores: new o un nombre de ventana. En el primer caso la widget creará su propio mapa de color, y en el segundo lo compartirá con otra ventana ya creada.
Si no se especifica la opción -colormap la widget usa el mismo color que su ventana padre. Como ocurría en el caso de la opción de configuración -class la opción -colormap no puede cambiarse con la orden configure.
-height
Especifica la altura que se desea para la widget expresada en unidades de pantalla
-screen
Especifica el nombre del dispositivo físico de visualización en el que se va a dibujar la widget toplevel Es la especificación de una pantalla del sistema X-Windows. Esta opción no puede cambiarse con la orden de widget configure.
-visual
Se refiere a la forma en que se representa cada pixel en la pantalla. En X hay seis formas predefinidas que son: -staticgrey (se usa una paleta de grises fija), -greyscale (se usa una paleta de grises que se puede cambiar), -staticco1or (se usa una paleta en color definida por el servidor X), -pseudocolor (Se usa una paleta en color que se puede cambiar),-directcolor (el color se determina a partir de tres paletas de colores, una para cada componente RGB), y -Truecolor (el color se determina a partir de tres paletas definidas por el servidor X, una para cada componente RGB).Esta opción tampoco puede modificarse con la orden de widget configure.
Introducción
Tcl/Tk
Diseño de interfaces de usuario,
Tcl/Tk Página 41 de 42
Descargar
Enviado por: | Beni Cuevas |
Idioma: | castellano |
País: | España |