El propósito de un widget de entrada es permitir que el
usuario vea y modifique una sola línea de texto.
- Si desea mostrar varias líneas de texto que se
pueden editar, consulte la Sección 24.
- Si desea mostrar una o más líneas de texto que
el usuario no puede modificar, consulte la Sección 12.
Algunas definiciones:
- La selección es una región resaltada del texto
dentro del widget Entry, si hay una. Por lo general, la selección la realiza el
usuario con el mouse y el texto seleccionado se copia en el portapapeles del
sistema. Sin embargo, Tkinter le permite controlar si el texto seleccionado se
copia o no en el portapapeles. También puede seleccionar texto en una entrada
bajo el control del programa.
- El cursor de inserción muestra dónde se
insertará el nuevo texto. Solo se muestra cuando el usuario hace clic con el
mouse en algún lugar del widget. Suele aparecer como una línea vertical
parpadeante dentro del widget. Puede personalizar su apariencia de varias
maneras.
- Las posiciones dentro del texto visualizado del
widget se dan como un índice. Hay varias formas de especificar un índice:
- Como índices normales de Python, comenzando
desde 0.
- La constante tk.END se refiere a la
posición después del texto existente.
- La constante tk.INSERT se refiere a la
posición actual del cursor de inserción.
- La constante tk.ANCHOR se refiere al
primer carácter de la selección, si hay una selección.
- Es posible que deba averiguar qué posición del
caracter en el widget corresponde a una posición dada del mouse. Para
simplificar ese proceso, puede usar como índice una cadena de la forma '@n',
donde n es la distancia horizontal en píxeles entre el borde izquierdo
del widget Entry y el mouse. Tal índice especificará el carácter en
esa posición horizontal del mouse.
Para crear un nuevo widget de entrada en una ventana raíz o
marco llamado padre:
w=tk.Entry(parent, option, ...)
Este constructor devuelve el nuevo widget de entrada. Las
opciones incluyen:
Tabla 17. Opciones de widget de entrada
|
bg o bakground
|
El color de
fondo dentro del área de entrada. El valor predeterminado es un gris claro.
|
bd o
borderwidth
|
El ancho del
borde alrededor del área de entrada, ver Sección 5.1. El valor predeterminado
es dos píxeles.
|
cursor
|
El cursor
utilizado cuando el mouse está dentro del widget de entrada, ver Sección 5.8.
|
disabledbackground
|
El color de
fondo que se mostrará cuando el widget esté en tk.DISABLED. Para conocer los valores de las opciones,
consulte bg.
|
disabledforeground
|
El color de
primer plano que se mostrará cuando el widget esté en tk.DISABLED. Para conocer los valores de las opciones,
consulte fg.
|
exportselection
|
De manera
predeterminada, si selecciona texto dentro de un widget Entry, es automáticamente exportado al
portapapeles. Para evitar esta exportación, use exportselection=0.
|
fg o foreground
|
El color
utilizado para representar el texto. El valor predeterminado es negro.
|
font
|
La fuente
utilizada para el texto ingresado en el widget por el usuario. Ver la Sección
5.4.
|
highlightbackground
|
Color del foco
resaltado cuando el widget no tiene foco. Ver sección 53.
|
highlightcolor
|
Color que se
muestra en el foco resaltado cuando el widget tiene el foco.
|
highlightthickness
|
Espesor del
foco resaltado.
|
insertbackground
|
Por defecto, el
cursor de inserción (que muestra el punto dentro del texto donde se insertará
una nueva entrada de teclado) es negra. Para obtener un color diferente del
cursor de inserción, establezca insertbackground en cualquier color, Ver sección 5.3.
|
insertborderwidth
|
Por defecto, el
cursor de inserción es un simple rectángulo. Puedes obtener el cursor con efecto
de relieve con tk.RAISED (consulte la
Sección 5.6) configurando insertborderwidth a la dimensión del borde 3-d. Si lo hace,
asegúrese de que la opción de ancho de inserción sea al menos dos veces ese
valor.
|
insertofftime
|
Por defecto, el
cursor de inserción parpadea. Puede establecer insertofftime en un valor en milisegundos para
especificar cuánto tiempo pasa el cursor de inserción apagado. El valor
predeterminado es 300ms. Si usa insertofftime=0, el cursor de inserción no Parpadeo en
absoluto.
|
insertontime
|
Similar a insertofftime, esta opción especifica cuánto tiempo el
cursor gasta por parpadeo. El valor predeterminado es 600 (milisegundos).
|
insertwidth
|
Por defecto, el
cursor de inserción tiene 2 píxeles de ancho. Puede ajustar esto configurando
insertwidth a cualquier
dimensión.
|
justify
|
Esta opción
controla cómo se justifica el texto cuando el texto no llena el ancho del widget. El valor puede ser tk.LEFT (predeterminado), tk.CENTER o tk.RIGHT.
|
readonlybackground
|
El color de
fondo que se mostrará cuando la opción state del widget sea 'readonly'.
|
relief
|
Selecciona
efectos de sombreado tridimensionales alrededor de la entrada de texto. Ver
sección 5.6. El valor predeterminado es relief=tk.SUNKEN.
|
selectbackground
|
El color de
fondo que se usará para mostrar el texto seleccionado. Ver la Sección 5.3.
|
selectborderwidth
|
El ancho del
borde para usar alrededor del texto seleccionado. El valor predeterminado es
un píxel.
|
selectforeground
|
El color de
primer plano (texto) del texto seleccionado.
|
show
|
Normalmente,
los caracteres que escribe el usuario aparecen en la entrada. Para hacer una
entrada ’password’ que hace eco
de cada carácter como un asterisco, establezca show='*'.
|
state
|
Use esta opción
para deshabilitar el widget Entry para que el usuario no pueda escribir nada allí. Use state=tk.DISABLED para deshabilitar el widget, state=tk.NORMAL para permitir la entrada del usuario
nuevamente. Tu programa también puede ver si el cursor está actualmente sobre
el widget al interrogar esto opción, tendrá el valor tk.ACTIVE cuando el mouse esté sobre él, pero el
contenido del widget todavía se puede seleccionar o copiar. También puede
establecer esta opción en 'disabled', que es como tk.DISABLED.
|
takefocus
|
Por defecto, el
foco se desplazará a través de widgets del entrada. Establezca esta opción en
0 para saca el widget de la secuencia. Vea la Sección 53.
|
textvariable
|
Para poder
recuperar el texto actual de su widget de entrada, debes establecer esta
opción en una instancia de la clase StringVar, ver la Sección 52. Puedes recuperar el
texto usando v.get(), o configúrelo
usando v.set(), donde v es el asociado al control de variables.
|
validate
|
Puede usar esta
opción para configurar el widget para que se verifique su contenido por una
función de validación en ciertos momentos. Consulte la Sección 10.2.
|
validatecommand
|
Una devolución
de llamada que valida el texto del widget. Consulte la Sección 10.2.
|
width
|
El tamaño de la
entrada en caracteres. El valor predeterminado es 20. Para las fuentes
proporcionales, la longitud física del widget se basará en el ancho promedio
de un carácter multiplicado por el valor de la opción de ancho.
|
xscrollcommand
|
Si espera que el
usuario ingresen más texto del que puede entrar en el tamaño en pantalla del
propio widget, puede vincular su widget de entrada a una barra de
desplazamiento. Establezca estas opciones con el método .set de la barra de desplazamiento. Consulte la
Sección 10.1.
|
Los métodos de entrada de objetos incluyen:
.delete(first, last=None): Borra
caracteres de widget, empezando por el de índice de first, hasta (pero
no incluyendo) el carácter en la posición last. Si se omite el segundo
argumento, solo se elimina el carácter único en la posición first.
.get(): Devuelve el texto actual de la
entrada como una cadena.
.icursor(index): Establezca el cursor
de inserción justo antes del carácter en el índice dado.
.index(index): Cambie el contenido de
la entrada para que el carácter en el índice dado sea el carácter visible más
a la izquierda. No tiene ningún efecto si el texto se ajusta completamente
dentro de la entrada.
.insert(index, s): Inserta una cadena s
antes del carácter en el índice dado.
.scan_dragto(x): Vea el método scan_mark.
.scan_mark(x): Use esta opción para
configurar un escaneo rápido del contenido del widget Entry que tiene
una barra de desplazamiento que admite el desplazamiento horizontal. Para
implementar esta función, vincule el evento de botones del mouse a un
controlador que llame a scan_mark(x), donde x es la posición x
actual del mouse. Luego, vincule el evento <Motion> a un
controlador que llame a scan_dragto(x), donde x es la
posición x actual del mouse. El método scan_dragto desplaza
el contenido del widget Entry continuamente a una velocidad
proporcional a la distancia horizontal entre la posición en el momento de la
llamada scan_mark y la posición actual.
.select_adjust(index): Este método se
utiliza para asegurarse de que la selección incluya el carácter en el índice
especificado. Si la selección ya incluye ese caracter, no pasa nada. De lo
contrario, la selección se expande desde su posición actual (si corresponde)
para incluir el índice de posición.
.select_clear(): Borra la selección. Si
actualmente no hay una selección, no tiene ningún efecto.
.select_from(index): Establece la
posición del índice tk.ANCHOR en el carácter seleccionado por el
índice y selecciona ese carácter.
.select_present(): Si hay una
selección, devuelve verdadero, de lo contrario devuelve falso.
.select_range(star, end): Establece la
selección bajo el control del programa. Selecciona el texto que comienza en el
índice inicial (star), hasta el carácter final (end), pero sin incluirlo. La
posición inicial debe ser anterior a la posición final. Para seleccionar todo
el texto en un widget de entrada use e.select_range(0, tk.END).
.select_to(index): Selecciona todo el
texto desde la posición tk.ANCHOR hasta (pero sin incluir) el carácter
en el índice dado.
.xview(index): Igual que .xview().
Este método es útil para vincular el widget Entry a una barra de
desplazamiento horizontal. Consulte la Sección 10.1.
.xview_moveto(f): Coloca el texto en la
entrada de modo que el carácter en la posición f (relativo a todo el
texto) se coloque en el borde izquierdo de la ventana. El argumento f
debe estar en el rango [0, 1], donde 0 significa el extremo izquierdo
del texto y 1 el extremo derecho.
.xview_scroll(number, what): Se usa
para desplazar la entrada horizontalmente. El argumento what debe ser tk.UNITS,
para desplazarse por el ancho de los caracteres, o tk.PAGES, para
desplazarse por fragmentos del tamaño del widget de entrada. El número es
positivo para desplazarse de izquierda a derecha, negativo para desplazarse de
derecha a izquierda. Por ejemplo, para un widget de entrada e, e.xview_scroll(-1,
tk.PAGES) movería el texto una "página" a la derecha, y e.xview_scroll(4,
tk.UNITS) movería el texto cuatro caracteres a la izquierda.
Hacer que un widget de entrada se pueda desplazar requiere
un pequeño código adicional de su parte para adaptar la devolución de llamada
del widget de barra de desplazamiento a los métodos disponibles en el widget de
entrada. Aquí hay algunos fragmentos de código que ilustran la configuración.
Primero, la creación y vinculación de los widgets Entry y Scrollbar:
self.entry=tk.Entry(self, width=10)
self.entry.grid(row=0, sticky=tk.E+tk.W)
self.entryScroll=tk.Scrollbar(self, orient=tk.HORIZONTAL,
command=self.__scrollHandler)
self.entryScroll.grid(row=1, sticky=tk.E+tk.W)
self.entry['xscrollcommand']=self.entryScroll.set
Aquí está la función del adaptador mencionada anteriormente:
def __scrollHandler(self, *L):
op, howMany=L[0],
L[1]
if op=='scroll':
units=L[2]
self.entry.xview_scroll(howMany, units)
elif op=='moveto':
self.entry.xview_moveto(howMany)
En algunas aplicaciones, será conveniente verificar el contenido
de un widget de entrada para asegurarse de que sean válidos de acuerdo con
alguna regla que su aplicación debe aplicar, para ello, se deberá definir lo
que es válido escribiendo una función de devolución de llamada que verifica el
contenido y señala si es válido o no.
Aquí está el procedimiento para configurar la validación en
un widget.
- Escriba una función de devolución de llamada que
verifique el texto en la entrada y devuelva Verdadero si el texto es válido, o
Falso si no lo es. Si la devolución de llamada devuelve False, el intento del
usuario de editar el texto será rechazado y el texto no se modificará.
- Registre la función de devolución de llamada. En
este paso, producirá un contenedor Tcl alrededor de una función de
Python. Suponga que su función de devolución de llamada es una función llamada isOkay,
para registrar esta función, use el método de widget universal register(isOkay).
Este método devuelve una cadena de caracteres que Tkinter puede usar para
llamar a su función.
- Cuando llame al constructor Entry, use
la opción validatecommand en el constructor Entry para
especificar su devolución de llamada, y use la opción validate para especificar
cuándo se llamará la devolución de llamada para validar el texto en la
devolución de llamada.
Aquí están los valores de la opción de validación y lo que
significan:
'focus': Valide cada vez que el widget Entry
obtenga o pierda el foco (consulte la Sección 53).
'focusin': Valide siempre que el widget tenga el
foco.
'focusout': Valide siempre que el widget pierda el
foco.
'key': Valide siempre que cualquier pulsación de
tecla cambie el contenido del widget.
'all': Validar en todas las situaciones anteriores.
'none': Desactiva la validación. Este es el valor
de opción predeterminado. Tenga en cuenta que esta es la cadena 'none',
no el valor especial de Python None.
El valor de la opción validatecommand depende de
los argumentos que desea que reciba su devolución de llamada.
- Quizás lo único que necesita saber la devolución
de llamada es qué texto aparece actualmente en la entrada. Si ese es el caso,
puede usar el método .get() de la variable de texto asociada con el
widget para recuperar ese texto. En este caso, todo lo que necesita es la
opción validatecommand=f, donde f es el nombre de su función
de devolución de llamada.
- Tkinter también puede proporcionar una serie de
elementos de información para la devolución de llamada. Si desea utilizar
algunos de estos elementos, cuando llame al constructor Entry, use la
opción validatecommand=(f, s1, s2, ...), donde f es el nombre
de su función de devolución de llamada, y cada s adicional es un
código de sustitución. Para cada código de sustitución que proporcione, la
devolución de llamada recibirá un argumento posicional que contiene el valor
apropiado.
Aquí están los códigos de sustitución:
Tabla 18. Códigos de sustitución de
devolución de llamada
|
'%d'
|
Código de
acción: 0 para un
intento de eliminación, 1 para un
intento de inserción o -1 si la
devolución de llamada se solicitó para focusin, focusout o un cambio en la variable de texto.
|
'%i'
|
Cuando el
usuario intenta insertar o eliminar texto, este argumento será el índice del
comienzo de la inserción o eliminación. Si la devolución de llamada se debió
a focusin, focusout o un cambio en la variable de texto, en ese
caso, el argumento será -1.
|
'%P'
|
El valor que
tendrá el texto si se permite el cambio.
|
'%s'
|
El texto en la
entrada antes del cambio.
|
'%S'
|
Si la llamada
se debió a una inserción o eliminación, este argumento será el texto que se
inserta o elimina.
|
'%v'
|
El valor actual
de la opción de validación del widget.
|
'%V'
|
El motivo de
esta devolución de llamada: uno de 'focusin', 'focusout', 'key' o 'force' si se cambió la variable de texto.
|
'%W'
|
El nombre del
widget.
|
Aquí hay un pequeño ejemplo. Suponga que desea que su
devolución de llamada reciba el '%d' para averiguar por qué se llamó, '%i'
para averiguar dónde ocurriría la inserción o eliminación, y '%S' para
averiguar qué se debe insertar o eliminar. Su método podría verse así:
def isOkay (self, why, where, what):
...
Luego, utiliza el método universal .register() para
ajustar esta función. Suponemos que self es un widget.
okayCommand=self.register(isOkay)
Para configurar esta devolución de llamada, usaría estas dos
opciones en el constructor Entry:
self.w=Entry(self, validate='all',
validatecommand=(okayCommand, '% d', '% i', '% S'), ...)
Suponga que la entrada actualmente contiene la cadena 'abcdefg',
y el usuario selecciona 'cde' y luego presiona Retroceso. Esto daría
como resultado una llamada isOkay(0, 2, 'cde'):0 para eliminación, 2
para la posición anterior a 'c' y 'cde' para que se elimine
la cadena. Si isOkay() devuelve True, el nuevo texto será 'abfg',
si devuelve False, el texto no cambiará.
El widget Entry también admite una opción de
comando no válido que especifica una función de devolución de llamada que se
llama cada vez que el comando validate devuelve False. Este
comando puede modificar el texto en el widget utilizando el método .set()
en la variable de texto asociada al widget . Configurar esta opción funciona
igual que configurar el comando validar . Debe usar el método .register()
para ajustar su función Python. Este método devuelve el nombre de la función
envuelta como una cadena. Luego pasará como el valor de la opción de comando no
válido esa cadena, o como el primer elemento de una tupla que contiene códigos
de sustitución.
Hasta el próximo jueves, salud y saludos!
Mauricio José Tobares