Informatica Grafica
C A P I T U L O17 El Widget Text

El 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:

Ejemplo 17-1
set w .text
catch {destroy $w}
toplevel $w
wm title $w "Texto Editable"
text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 \
-height 30
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
# Se inserta el texto en el widget
$w.text insert 0.0 \
{Esta ventana es un widget text. Muestra una o mas líneas de texto,
y permite editar dicho texto. Esto es un resumen de lo que puede hacerse
con este widget:
1. Scrolling.
2. Scanning.
3. Insertar texto.
4. Seleccionar texto.
5. Borrar y reemplazar.
6. Copiar la selección.
7. Editar texto.
8. Redimensionar la ventana.}

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:

$t mark set prueba_marca "insert wordstart"
$t mark unset prueba_marca


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

$t tag add etiqueta 1.0 end

Un tag puede ser elimanado de un texto mediante el comando tag remove:

$t tag remove etiqueta 3.0 6.end


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.


Ejemplo 17-2.
set w .style
catch {destroy $w}
toplevel $w
wm title $w "Ejemplo de diferentes estilos de texto"
# Se crea el widget texto
text $w.text -yscrollcommand "$w.scroll set" -setgrid true \
-width 70 -height 32 -wrap word
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
# Se crean los estilos
$w.text tag configure bold -font {Courier 12 bold italic}
$w.text tag configure big -font {Courier 14 bold}
$w.text tag configure verybig -font {Helvetica 24 bold}
$w.text tag configure color1 -background #a0b7ce
$w.text tag configure color2 -foreground red
$w.text tag configure raised -relief raised -borderwidth 1
$w.text tag configure sunken -relief sunken -borderwidth 1
$w.text tag configure bgstipple -background black -borderwidth 0 \
-bgstipple gray12
$w.text tag configure fgstipple -fgstipple gray50
$w.text tag configure underline -underline on
$w.text tag configure overstrike -overstrike on
$w.text insert end {El widget text permite mostrar informacion en una
gran variedad de estilos. Estos estilo se controlan mediante el mecanismo
denominado }
$w.text insert end tags bold
$w.text insert end {. Los tags son nombres simbólicos que representan un estilo de
texto previamente definido, y que permiten que al asociar uno de estos tags
a un texto, frase o caracteres, estos adquieran las propiedades asignadas a dicho tag.
Los estilos disponibles son:
}
$w.text insert end "\n1. Fuente." big
$w.text insert end " Puede escogerse cualquier fuente X, "
$w.text insert end grande verybig
$w.text insert end " o "
$w.text insert end " pequeña.\n"
$w.text insert end "\n2. Color." big
$w.text insert end " Puede cambiarse el color de "
$w.text insert end background color1
$w.text insert end " o el de "
$w.text insert end foreground color2
$w.text insert end "\ncolor, or "
$w.text insert end ambos {color1 color2}
$w.text insert end ".\n"
$w.text insert end "\n3. Patrones." big
$w.text insert end " Puede escogerse patrones de relleno para el "
$w.text insert end background bgstipple
$w.text insert end " o para el "
$w.text insert end foreground fgstipple
$w.text insert end "\n4. Subrayado." big
$w.text insert end " Es posible "
$w.text insert end subrayar underline
$w.text insert end " trozos de texto.\n"
$w.text insert end "\n5. Tachar." big
$w.text insert end " También puede "
$w.text insert end "tacharse el texto" overstrike
$w.text insert end " que se desee.\n"
$w.text insert end "\n6. Efectos 3-D ." big
$w.text insert end { Es posible mostrar texto con relieve }
$w.text insert end elevado raised
$w.text insert end " o relieve "
$w.text insert end hundido sunken
$w.text insert end ".\n"

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>.

Ejemplo 17-3
set w .bind
catch {destroy $w}
toplevel $w
wm title $w "Ejemplo de Tag Bindings"
# Se crea el widget texto con barra de scroll
text $w.text -yscrollcommand "$w.scroll set" -setgrid true \
-width 60 -height 12 -wrap word
scrollbar $w.scroll -command "$w.text yview"
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
# Crea los estilos de texto, que seran llamados al ejecutarse los bind.
# Texto resaltado (color verde y relieve elevado) ...
set bold "-background #43ce80 -relief raised -borderwidth 1"
# Texto normal (color por defecto y relieve plano)...
set normal "-background {} -relief flat"
# Aniade texto al widget texto.
$w.text insert 0.0 {\
En este ejemplo, se ha asociado un bind a un tag, de forma que al pasar
con el ratón sobre el texto marcado con dicho tag, este resalte en color verde y relieve.
}
$w.text insert end \
{1. Al pasar el ratón sobre este texto....} d1
$w.text insert end \n\n
$w.text insert end \
{2. resaltara en color verde.} d2
# Se crean los bindings para los tags.
foreach tag {d1 d2} {
$w.text tag bind $tag <Any-Enter> "$w.text tag configure $tag $bold"
$w.text tag bind $tag <Any-Leave> "$w.text tag configure $tag $normal"
}
# Aqui iria el comando a ejecutar cuando se hiciese click sobre dichos textos.
$w.text tag bind d1 <1> {}
$w.text tag bind d2 <1> {}
$w.text mark set insert 0.0
# Para que el texto no sea editable. $w.text configure -state disabled

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.

button $t.help -text Ayuda -command Ayuda
$t window create end -window $t.help

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.

Ejemplo 17-4
set w .twind
catch {destroy $w}
toplevel $w
wm title $w "Ejemplo de widgets embebidos"
frame $w.f -highlightthickness 2 -borderwidth 2 -relief sunken
set t $w.f.text
text $t -yscrollcommand "$w.scroll set" -setgrid true -width 70 \
-height 8 -wrap word -highlightthickness 0 -borderwidth 0
pack $t -expand yes -fill both
scrollbar $w.scroll -command "$t yview"
pack $w.scroll -side right -fill y
pack $w.f -expand yes -fill both
$t tag configure center -justify center -spacing1 5m -spacing3 5m
$t tag configure buttons -lmargin1 1c -lmargin2 1c -rmargin 1c \
-spacing1 3m -spacing2 0 -spacing3 0
# Se crean los botones a embeber...
button $t.b1 -text "Boton1" -command " "
button $t.b2 -text "Boton2" -command " "
checkbutton $t.check -text "CheckBoton"
radiobutton $t.radio -text "RadioBoton"
$t insert end "Un widget texto puede contener otros widgets"
$t insert end "estos son llamados \"embedded windows\", "
$t insert end "y puede ser cualquier tipo de widget. "
$t insert end "Por ejemplo, esto es un botón embebido "
$t window create end -window $t.b1
$t insert end " y esto es otro botón embebido "
$t window create end -window $t.b2
$t insert end " Tambien puede haber botones de chequeo "
$t window create end -window $t.check
$t insert end " o radiobotones."
$t window create end -window $t.radio

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.

Previous Page Next Page


© 1995-98, etsimo WWW team
Última modificación: 19 de Agosto de 1998 - 17:48:37