Читать книгу Desarrollo de interfaces gráficas en Python 3 con Tkinter - Tomás Domínguez Mínguez - Страница 17
4.4 FOCO
ОглавлениеMuchos de los widgets de una aplicación, especialmente aquellos con los que se realiza la entrada de datos, son susceptibles de tener el foco en un momento determinado; es decir, que lo que se escriba con el teclado vaya dirigido hacia ellos. Una forma de hacer que un widget tenga el foco es pulsarlo con el ratón. Pero también se podría usar el tabulador, haciendo que este vaya pasando de uno a otro, en lo que se conoce como “enfoque transversal” (focus traversal). El orden en el que se mueve sigue las siguientes reglas:
•En el caso de los widgets contenidos en la ventana principal (o un widget contenedor), el foco los va recorriendo en el mismo orden en que se crearon.
•Si el valor del atributo takefocus de un widget contenedor fuera True (por ejemplo, un frame o un panel), el foco iría primero a este y, luego, a todos los que contenga en el orden en que fueron creados, de forma recursiva.
•Para evitar que un widget pueda llegar a tener el foco, solo tiene que asignar el valor False al atributo takefocus, lo que haría que este pasara de largo en su recorrido al ir pulsando el tabulador.
Por defecto, el foco no pasará por las etiquetas, frames o menús al pulsar el tabulador. Para que lo haga, tendrá que asignar el valor True a dicho atributo.
Como ya sabe, los atributos highlightthickness y highlightcolor permiten dibujar un marco del ancho y color especificado alrededor del widget que tenga el foco.
Cada widget se comporta de una forma diferente cuando tiene el foco:
•Campo de entrada de texto. Cualquier carácter se agregará a su texto.
•Botón. Podrá presionarse con la barra espaciadora.
•Checkbuttons. Cambia de estado (seleccionado o no seleccionado) al pulsar la barra espaciadora.
•Radiobuttons. Se selecciona (si todavía no lo estuviera) con la barra espaciadora.
•Barra de scroll. Las teclas PageUp y PageDown desplazan el contenido de página en página. Las teclas ↑ y ↓ lo mueven en sentido vertical, y las teclas ← y → en sentido horizontal.
•Barra de desplazamiento. Si su orientación fuera horizontal, se movería con las teclas ← y →. Si fuera vertical, se movería con las teclas ↑ y ↓.
Tendrá ocasión de estudiar cada uno de estos widgets más adelante.
Para probar el funcionamiento de esta opción, realizará una nueva práctica utilizando campos de entrada de texto. Es habitual que los formularios le permitan pasar de un campo a otro pulsando el tabulador. Aunque este widget se describirá en detalle más adelante, las opciones con las que se va a utilizar ya las conoce, por lo que no será impedimento para entender el código mostrado a continuación:
En la primera sentencia, además de Tk, se importa también la clase Entry, que representa el campo de entrada de texto:
A continuación, se crea la ventana principal (root):
Después, se crean los campos de entrada de texto. Todo lo que se escriba en ellos aparecerá en color azul sobre un fondo amarillo (opciones bg y fg), con un tipo de letra Times New Roman de 24 píxeles, en cursiva y negrita (opción font). Además, se añaden los atributos highlightcolor y highlightthickness para que, cuando el campo tenga el foco (se pueda escribir en él), muestre un marco de color rojo con un grosor de línea de dos píxeles. Lo más interesante en esta práctica es que el tercer campo incluye también la opción takefocus, cuyo valor False hará que no pueda obtener el foco al pulsar el tabulador:
Las últimas sentencias sitúan los campos de texto en la ventana principal, uno debajo del otro. Para separarlos de los bordes de esta y entre sí, se utilizan las opciones padx y pady:
Ejecute el programa y pulse sobre el primer campo. Observe que aparece un marco rojo alrededor, que indica que ya puede empezar a escribir en él. Ahora pulse el tabulador; comprobará que el foco salta al campo inferior. Vuelva a pulsar de nuevo el tabulador. Esta vez, el foco irá al último campo, saltando el tercero, ya que se asignó el valor False a su opción takefocus. Si vuelve a pulsar el tabulador, el foco regresará de nuevo al primer campo, repitiéndose el ciclo.
La siguiente secuencia de imágenes muestra este recorrido del foco: