DMarlon Studio

Lección 4 · 4 de 20

Campos de texto con StringVar · tkinter

El campo de texto de tkinter (Entry) unido a una StringVar: valor inicial, lectura con get() y una etiqueta que cambia mientras se escribe.

tkinter · Campos de texto con StringVar en DMarlon Studio: el código del ejemplo y la ventana que abre al ejecutarlo

Una `StringVar` es una variable de tkinter que guarda texto. tk.StringVar(value="Ada Lovelace") la crea ya con un valor, así que el campo aparece relleno.

ttk.Entry(root, textvariable=name, width=36) es el campo de texto: una sola línea que se puede editar. Con `textvariable`, campo y variable quedan unidos: lo que se escribe va a la variable y lo que se pone con name.set(...) aparece en el campo. width es el ancho en caracteres y entry.focus() deja el cursor en él.

`name.trace_add("write", update)` pide que se llame a update cada vez que cambie la variable, es decir, con cada tecla. update lee el texto con `name.get()` y lo pone en el saludo; se llama una vez al principio para que la etiqueta no empiece vacía.

El botón Clear hace name.set(""): vacía el campo y, gracias a la traza, el saludo pasa a «Hello, nobody!». El lambda sirve para pasar a command una función de una sola línea.

En DMarlon Studio es el Campo de texto de la paleta. Su *Texto inicial* se pone en el inspector, y el estudio crea para cada campo una StringVar llamada self.<Nombre>_var, con la que se lee y se cambia su valor desde el código.

Código · main.py

import tkinter as tkfrom tkinter import ttkroot = tk.Tk()root.title("Entry and StringVar")root.geometry("440x250")# A StringVar holds the text; the entry shows it and edits it.name = tk.StringVar(value="Ada Lovelace")ttk.Label(root, text="Your name:").pack(anchor="w", padx=32, pady=(28, 4))entry = ttk.Entry(root, textvariable=name, width=36)entry.pack(anchor="w", padx=32)entry.focus()# This label follows the variable: it changes as you type.greeting = ttk.Label(root, font=("Helvetica", 18))greeting.pack(pady=22)def update(*args):    greeting.config(text=f"Hello, {name.get() or 'nobody'}!")name.trace_add("write", update)  # call update on every changeupdate()ttk.Button(root, text="Clear", command=lambda: name.set("")).pack()root.mainloop()

Para recordar

  • textvariable une el campo con una StringVar.
  • get() lee el texto y set() lo cambia.
  • trace_add("write", función) avisa de cada cambio.
  • width en un Entry se mide en caracteres.

Ejercicio

Añada un segundo campo para el apellido y haga que el saludo muestre el nombre y el apellido juntos.