E
l widget text, es el widget más versátil de Tk. Es un simple texto editable, que puede ser utilizado para mostrar texto y para su manipulación (como editor de textos). Pero, mientras que por un lado, la utilización básica de este widget es muy simple, por otro, el uso de sus posibilidades avanzadas puede llegar a ser realmente complejo. En este capítulo se mostrará todo aquello que puede ser interesante para aquel que se inicia en su manejo; para aplicaciones más sofisticadas, se recomienda acudir al libro de Welch (Practical Programming in Tcl and Tk) o, mejor aún, a la propia ayuda de Tcl/Tk.El widget text
Tk proporciona una serie de widgets que permiten el manejo de texto. El widget label permite manejar texto sólo de lectura y en una única línea. El widget entry permitirá el manejo de un texto, que el usuario puede introducir, en una única línea. El widget listbox tiene una serie de líneas de texto a las que se puede acceder mediante el uso de barras de scroll. Por último, el widget text proporciona un texto multilínea de uso general.
Las principales diferencias entre estos widgets, es la forma en que cada uno puede hacer referencia al textoque contiene .Así, el entry hace referencia al texto contenido en él mediante los caracteres que lo forman. La listbox hace referencia a líneas de texto; y el text a líneas y caracteres.
En el siguiente ejemplo puede verse el código de un editor de texto muy simple, en el que se ha insertado por programa un cierto texto:
El resultado es el siguiente:

Puede verse el texto insertado, y como una parte de él se encuentra seleccionado.
Indices
Los caracteres en el widget text son direccionados por su número de línea y por su posición dentro de esa línea. Las líneas se numeran partiendo de 1, mientras que los caracteres lo hacen a partir de 0.
Así 1.0 será el primer carácter del texto; 1.1 el segundo de la primera línea; y 1.end, el carácter justo antes de la nueva línea, en la línea 1.
También existen índices simbólicos. El índice insert es la posición donde será insertado el próximo carácter cuando el usuario lo introduzca por el teclado.
Tabla 17-1. Indices del widget text
|
linea.caracter |
Línea, contando desde . Carácter, contando desde 0. |
|
@ x,y |
El carácter bajo la posición especificada. |
|
end |
Justo antes del último carácter. |
|
insert |
La posición a la derecha después del cursor de inserción. |
|
mark |
Justo antes del nombre mark. |
|
tag .first |
El primer carácter del texto marcado etiqueta tag, |
|
tag .last |
Justo antes del último carácter marcado con tag. |
|
window |
La posición de la ventana embebida. |
Este widget admite una aritmética muy simple con los índices. Estas operaciones están recogidas en la tabla 17-2.
Tabla 17-2. Modificadores de los índices.
|
+ numero chars |
numero caracteres pasado el índice. |
|
- numero chars |
numero caracteres antes del índice. |
|
+ numero lines |
numero líneas pasado el índice. Mantiene la posición de carácter |
|
- numero lines |
numero líneas antes del índice. Mantiene la posición de carácter |
|
linestart |
El comienzo de la línea. |
|
lineend |
El fin de la línea (justo antes del carácter de nueva línea.) |
|
wordstart |
El primer carácter de una palabra. |
|
wordend |
Justo antes del último carácter de una palabra. |
Por ejemplo, el índice insert puede ser modificado de la siguiente manera:
"insert lineend"
"insert -3 chars"
En el primer caso, se insertará al final de la línea que tenga el índice dado; en el segundo, se insertará tres caracteres antes del índice dado.
Marks
Una mark (marca) es un nombre simbólico para una posición entre dos caracteres. Las marcas poseen la propiedad de mantener su posición lógica cuando el texto es borrado, no su posición numérica.
Las marcas son creadas con la orden mark set, y pueden ser borradas explícitamente con mark unset.
Una vez definida una marca, puede ser utilizada en operaciones que requieran un índice. En este caso, la marca representaría al carácter justo antes de dicha marca.
Es posible usar casi cualquier carácter para dar nombre a una marca, pero no se deben usar los espacios, el signo más (+) o el menos (-).
Un ejemplo de marcas sería el siguiente, donde $t representaría a un widget text:
Tags
Los tags (etiquetas), al igual que las marks, son un nombre simbólico, pero en este caso para un grupo de caracteres, no para una posición. Es posible usar cualquier cadena como nombre para un tag, pero no deben usarse números, espacios, el signo más (+) o el signo menos (-), ya que estos caracteres son usados en la aritmética de marks, y pueden dar problemas si se utilizan en el nombre de un tag.
Un tag tiene una serie de atributos que van a modificar al texto que es mostrado por pantalla, y que ha sido etiquetado con dicho tag. Estos atributos incluyen las fuentes, colores y justificación. Un tag puede tener binds asociados con lo que es perfectamente posible crear un hipertexto. De hecho, existen librerías de Tk que permiten mostrar texto en formato HTML en un widget text, mediante el artificio de convertir las etiquetas de HTML en tag de Tk.
Un tag se añade a un texto mediante la instrucción tag add. La siguiente línea añade el tag etiqueta a todo el texto en el widget (desde el carácter 1.0 hasta el carácter end):
Un tag puede ser elimanado de un texto mediante el comando tag remove:
Atributos de un tag
Los atributos de un tag son definidos mediante la operación tag configure. La tabla 17-3 muestra alguno de los atributos más utilizados.
Tabla 17-3. Atributos de un tag.
|
background color |
Color del fondo del texto. |
|
bgstipple bitmap |
Patrón de relleno para el color del fondo del texto. |
|
borderwidth pixels |
Ancho para los efectos 3D del borde. |
|
fgstipple bitmap |
Patrón de relleno para el color del texto. |
|
font fuente |
La fuente para el texto. |
|
foreground color |
Color del texto. |
|
justify tipo |
Justificación del texto : left, right o center. |
|
lmargin1 pixels |
Identación del lado izquierdo de la línea. |
|
lmargin2 pixels |
Identación del lado izquierdo de una línea que haya pasado a la línea siguiente. |
|
relief tipo |
flat , raised, sunken, ridge o groove. |
|
rmargin pixels |
Margen derecho. |
|
spacing1 pixels |
Espacio sobre una línea. |
|
spacing2 pixels |
Espacio sobre la parte de una línea que ha sido cortado (por exceder la longitud de la ventana) y se ha situado en la siguiente línea. |
|
spacing3 pixels |
Espacio bajo una línea. |
|
underline bool |
Si es true, el texto será subrayado. |
En el siguiente ejemplo se utilizarán los tags para dar diferentes estilos al texto.
El resultado obtenido es este:

Interlineado y justificación en un texto
El interlineado se controla mediante tres atributos: spacing1, spacing2 y spacing3. El atributo spacing1 añade espacio sobre la primera línea mostrada, mientras que spacing2 lo añade sobre la parte del texto que no entra en la primera línea y que se divide en el resto de las líneas. Por su parte, spacing3 lo hace antes de la última línea.
Es decir, si el texto a insertar tiene una longitud de 80 caracteres, y la ventana sólo de 30, los primeros 30 caracteres quedarán afectados por spacing1, mientras que el resto, divididos en líneas de 30, quedarán afectados por el atributo spacing2.
En cuanto a los márgenes, se distingue entre la primera línea mostrada y las restantes. El atributo lmargin1 especifica la identación de la primera línea del texto, mientras que lmargin2 especifica el margen del resto de las líneas, si existen. Sólo existe un atributo que hace referencia al margen derecho, rmargin.
Bind asociados a los tags
Es posible asociar binds a los tags de forma que el usuario, haciendo click o doble click con el ratón sobre ciertas áreas del texto, ejecute diversas partes del programa.
Los únicos bind soportados por las etiquetas son <Enter>, <Leave>, <ButtonPress>, <Motion>, y <KeyPress>.
El resultado es un texto que reacciona a ciertos eventos (en este caso, al paso del ratón sobre él).


Widgets embebidos
El widget text puede mostrar dentro de él otros widgets de igual forma que lo hace con el texto. Estos widgets mostrados en el interior de un widget text reciben el nombre de widgets embebidos.
Por ejemplo, suponiendo que $t sea un widget text, esto crearía un botón embebido.
De igual forma se haría para cualquier otro widget.
Por defecto, un widget embebido es centrado en su línea de texto. Pero es posible ajustar esto mediante la opción align. Los posible valores para el alineamiento son top, center, baseline y bottom.
En el siguiente ejemplo, se muestran cuatro widgets embebidos, en este caso botones, aunque pudiera ser cualquier otro widget tk.

Un detalle a tener en cuenta es que al estar insertados los botones (o cualquier otro widget) dentro de un widget text, el cursor del ratón al pasar por encima de los botones presentará la forma de cursor de inserción propia de un widget text, algo que no es muy apropiado para pulsar un botón. Para remediar esto bastará darle un cursor al botón en el momento de crearlo con la opción -cursor.
Tabla 17-4. Algunas opciones para el comando create window.
|
align donde |
top , center, baseline o bottom. |
|
create comando |
Comando Tcl que crea el widget. |
|
padx pixels |
Espaciado en el eje x. |
|
pady pixels |
Espaciado en el eje y. |
|
strech bool |
Si es true, el widget es estirado verticalmente para ocupar el espacio de la línea de texto. |
|
window path |
Path Tk del widget embebido. |
Binds del widget text
El widget text posee un elevado número de binds asociados. La mayor parte de ellos se corresponden con los habituales controles de los más corrientes editores de texto, por ello sólo se indicarán aquí los más habituales.
Tabla 17-5. binds más habituales del widget text.
|
<Any-Key> |
Inserta un carácter en el widget. |
|
<Button-1> |
Coloca el cursor de inserción, borra la selección. |
|
<Control-Button-1> |
Coloca el cursor de inserción sin afectar a la selección. |
|
<B1-Motion> |
Hace avanzar la selección desde el punto de inserción. |
|
<Double-Button-1> |
Selecciona la palabra sobre la que se ha pinchado. |
|
<Triple-Button-1> |
Selecciona la línea sobre la que se ha pinchado. |
|
<Shift-Button-1> |
Hace que la selección termine donde se pulsa con el ratón. |
|
<Key-Left> o <Control-b> |
Mueve el cursor un carácter a la izquirrda. |
|
<Shift-Left> |
Mueve el cursor y extiende la selección. |
|
<Control-Left> |
Mueve el cursor por palabras. |
|
<Control-Shift-Left> |
Mueve el cursor por palabras y extiende la selección. |
|
<Key-Up> o <Control-p> |
Mueve el cursor una línea hacia arriba. Borra la selección. |
|
<Shift-Up> |
Extiende la selección hacia arriba. |
|
<Control-Up> |
Mueve el cursor por párrafos. |
|
<Control-Shift-Up> |
Mueve el cursor por párrafos y extiende la selección. |
|
<Next> o <Prior> |
Mueven el texto una pantalla completa. Borra la selección |
|
<Shift-Next> |
Mueve el texto una pantalla, extiende la selección. |
|
<Home> o <Control-a> |
Mueve el cursor a la primera línea del texto. |
|
<Shift-Home> |
Mueve el cursor a la línea de inicio y extiende la selección. |
|
<End> o <Control-e> |
Mueve el cursor a la última línea. |
|
<Shift-End> |
Mueve el cursor a la última línea y extiende la selección. |
|
<Delete> |
Borra el texto seleccionado. |
|
<Control-d> |
Borra el carácter a la derecha del cursor. |
|
<Control-k> |
Borra desde el cursor al final de la línea. |
|
<Control-o> |
Inserta una nueva línea , pero no avanza el cursor. |
|
<Control-w> |
Borra la palabra a la izquierda del cursor. |
|
<Control-x> |
Borra la selección (elimina el texto seleccionado). |
|
<Control-t> |
Transporta el carácter al otro lado del cursor. |
Además de los binds aquí expuestos existen bastantes más, algunos de ellos sin excesiva utilidad, pero gracias a todos estos binds es posible crear de forma muy sencilla un potente editor de textos.
Operaciones con el widget text
Las operaciones más comunes con el widget text quedan resumidas en la tabla 17-6. En la tabla $t representa un widget text.
Tabla 17-6. Operaciones más comunes con el widget text.
|
$t cget opcion |
Devuelve el valor de configuración de la opción dada. |
|
$t compare i1 op i2 |
Compara los índices. op es uno de estos: < <= == >= > != |
|
$t configure ... |
Devuelve o impone la configuración. |
|
$t delete i1 ?i2? |
Borra desde i1 hasta i2. Si i2 no se especifica, sólo borra el carácter de i1. |
|
$t get i1 ?i2? |
Devuelve el texto desde i1 hasta i2, o sólo el carácter de i1 si no se especifica i2. |
|
$t index indice |
Devuelve el índice numérico de indice. |
|
$t insert indice char ?tags? |
Inserta caracteres en el índice dado. |
|
$t mark nombres |
Devuelve la lista de marcas definidas. |
|
$t mark set nombre indice |
Define una marca con el nombre dado en el índice indice. |
|
$t mark unset nom1 ?nom2? |
Borra una o más marcas. |
|
$t search ?switch? patron indice ?nomVar? |
Busca el texto que se inicio en el índice dado. Devuelve el índice. El número de caracteres en el patron se colocan en nomVar. switch puede ser : -forw, -back, -exact, -regexp, -nowrap, -- |
|
$t see indice |
Posiciona la vista en indice. |
|
$t tag add nombre i1 ?i2? |
Añade el tag desde i1, pero no incluye a i2. |
|
$t tag bind nombre ?secuencia? ?script? |
Devuelve o define el bind para el tag dado por nombre. |
|
$t tag cget nombre opcion |
Devuelve el valor de la opción para el tag nombre. |
|
$t tag delete tag1 ?tag2? ...? |
Borra la información para los tags dados. |
|
$t tag names ?indice? |
Devuelve los nombres de los tags que hay en el índice dado |
|
$t tag remove tag i1 ?i2? |
Elimina el tag al grupo de caracteres que van desde i1 a i2. |
|
$t window config ir |
Obtiene o define la configuración de un widget embebido. |
|
$t window create ir ?opciones valor? |
Crea un widget embebido con las opciones dadas. |
Además de estas operaciones existen otras que pueden ser consultadas en la ayuda correspondiente. Por otro lado, no se han descrito operaciones relacionadas con las barras de scroll como pueden ser xview e yview por ser idénticas a las de cualquier otro widget que adita barras de scroll.
Atributos del widget text
La tabla 17-7, resume los atribuos más habituales en un widget text.
Tabla 17-7. Atributos más comunes en el widget text.
|
background o bg |
Color del fondo del texto. |
|
borderwidth |
Espacio extra alrededor del eje del texto. |
|
cursor |
Cursor a mostrar cuando el ratón este sobre el widget text. |
|
font |
Fuente del texto por defecto. |
|
foreground |
Color del texto. |
|
hightlightcolor |
Color widget que tiene el foco. |
|
insertbackground |
Color del cursor de inserción. |
|
insertborderwidth |
Tamaño del efecto 3D para el cursor de inserción. |
|
insertofftime |
Milisegundos que en el cursor no es visible durante el parpadeo. |
|
insertontime |
Milisegundos que en el cursor es visible durante el parpadeo. |
|
insertwidth |
Ancho del cursor de inserción. |
|
padX |
Espacio extra a la derecha y a la izquierda del texto. |
|
padY |
Espacio extra por encima y por debajo del texto. |
|
relief |
Relieve 3D: flat, sunken, raised, groove, ridge. |
|
selectbrackground |
Color del fondo para el texto seleccionado. |
|
selectforeground |
Color del texto seleccionado. |
|
selectborderwidth |
Tamaño del efecto 3D para el texto seleccionado. |
|
spacing1 |
Espacio extra sobre cada línea que no haya sido cortada. |
|
spacing2 |
Espacio entre cada línea cortada. |
|
spacing3 |
Espacio extra bajo cada línea que no haya sido cortada. |
|
state |
Indica si el texto es editable (normal) o no editable (disabled). |
|
width |
Ancho en caracteres del widget text. |
|
wrap |
Indica si una línea será cortada si no entra completa en el ancho del widget text. none, char o word. |
|
xscrollcommand |
Para el scroll horizontal. |
|
yscrollcommand |
Para el scroll vertical. |