Editores de texto sencillos con Tkinter: widget Text y Scrollbar
Tkinter es la biblioteca estándar de Python para crear interfaces gráficas. Cuando necesitas que el usuario introduzca texto de varias líneas, el widget Text es la herramienta adecuada. En este artículo descubrirás en detalle qué es, cómo se diferencia del widget Entry, y cómo combinarlo con Scrollbar para crear un mini bloc de notas funcional.
Text vs Entry: ¿cuál usar?
| Característica | Entry (una línea) | Text (múltiples líneas) |
|---|---|---|
| Tipo de contenido | Una sola línea de texto plano. | Texto multilínea con soporte para formatos básicos (párrafos, saltos de línea). |
| Longitud máxima | Se puede limitar con width o validate. |
Ilimitada (solo restringida por la memoria). |
| Gestión de cursor | Posición única, fácil de obtener con get(). |
Posiciones de índice tipo line.column (p. ej. "2.5"). |
| Barra de desplazamiento | No se necesita normalmente. | Requiere Scrollbar para contenido extenso. |
| Uso típico | Campos de búsqueda, formularios breves. | Notas, código, logs, editores de texto simples. |
Operaciones básicas con Text
El widget Text ofrece varios métodos que facilitan la manipulación del contenido. A continuación, los más usados:
- Insertar texto:
text_widget.insert(index, "texto") - Leer texto:
text_widget.get(start, end) - Borrar texto:
text_widget.delete(start, end)
Los índices más habituales son:
"1.0"– primera línea, columna 0 (inicio del widget)."end"– posición justo después del último carácter.tk.END– constante equivalente a"end".
Ejemplo rápido
import tkinter as tk
root = tk.Tk()
text = tk.Text(root, width=40, height=5)
text.pack(padx=10, pady=10)
# Insertar texto al principio
text.insert("1.0", "Hola, mundo!\n")
# Obtener todo el contenido
contenido = text.get("1.0", tk.END)
print("Contenido actual:", contenido)
# Borrar todo
text.delete("1.0", tk.END)
Asociar una Scrollbar al widget Text
Para que la barra de desplazamiento funcione correctamente, los dos widgets deben referenciarse mutuamente mediante los parámetros command y yscrollcommand:
scroll = tk.Scrollbar(root, orient="vertical", command=text.yview)
text.configure(yscrollcommand=scroll.set)
En un diseño típico, se coloca la barra a la derecha del Text usando la geometría grid o pack con side="right" y fill="y".
Ejemplo completo: Mini bloc de notas con botón "Limpiar"
El siguiente script muestra una aplicación mínima pero funcional. Incluye:
- Un
Textcon barra de desplazamiento vertical. - Un botón Limpiar que borra todo el contenido.
- Gestión de foco y accesibilidad básica.
import tkinter as tk
from tkinter import ttk
class MiniBlocNotas(tk.Tk):
def __init__(self):
super().__init__()
self.title("Mini Bloc de Notas – Tkinter")
self.geometry("500x400")
self._crear_widgets()
def _crear_widgets(self):
# Marco principal
frame = ttk.Frame(self, padding="10")
frame.pack(fill="both", expand=True)
# Text + Scrollbar
self.texto = tk.Text(frame, wrap="word", undo=True)
self.texto.pack(side="left", fill="both", expand=True)
barra = ttk.Scrollbar(frame, orient="vertical", command=self.texto.yview)
barra.pack(side="right", fill="y")
self.texto.configure(yscrollcommand=barra.set)
# Botón limpiar
btn_limpiar = ttk.Button(self, text="Limpiar", command=self.limpiar_texto)
btn_limpiar.pack(pady=5)
def limpiar_texto(self):
"""Borra todo el contenido del widget Text."""
self.texto.delete("1.0", tk.END)
self.texto.focus_set()
if __name__ == "__main__":
app = MiniBlocNotas()
app.mainloop()
Ejecuta el script y tendrás un bloc de notas básico. Puedes ampliarlo añadiendo menús de Archivo, Guardar o Buscar con los mismos principios.
Buenas prácticas, rendimiento y solución de problemas
1. Evita actualizar el widget en bucles muy rápidos
Si insertas texto de forma masiva (p. ej. logs en tiempo real), utiliza .after() o queue para agrupar actualizaciones y evitar parpadeos.
2. Configura wrap según la necesidad
Los valores posibles son "char", "word" y "none". "word" es el más amigable para notas.
3. Habilita deshacer/rehacer
Al crear el widget, pasa undo=True y luego text.edit_undo() / text.edit_redo() para añadir esa funcionalidad.
4. Seguridad al cargar contenido externo
Si el texto proviene de fuentes no confiables, evita usar etiquetas Tkinter (p. ej. image_create) que podrían generar referencias a objetos no deseados.
5. Compatibilidad y escalabilidad
- Funciona en Python 3.6+ y en Windows, macOS y distribuciones Linux con Tk 8.6 o superior.
- Para aplicaciones con cientos de miles de líneas, considera usar
ScrolledTextdel módulotkinter.scrolledtext, que encapsula automáticamente la barra de desplazamiento.
¿Tkinter frente a alternativas como PyQt o Dear PyGui?
Si bien Text es suficiente para editores simples, bibliotecas más avanzadas ofrecen:
- PyQt / PySide: widget
QPlainTextEditcon resaltado de sintaxis, soporte de Unicode avanzado y mejor rendimiento en textos muy extensos. - Dear PyGui: enfoque inmediato‑modo, menos código boilerplate, pero aún sin un widget de texto multilinea tan maduro como
Text.
Para proyectos ligeros o prototipos rápidos, Tkinter sigue siendo la opción más rápida de implementar.
Conclusión
El widget Text de Tkinter, junto con Scrollbar, brinda una solución completa para crear editores de texto sencillos y funcionales. Dominar sus métodos de inserción, lectura y borrado, así como aplicar buenas prácticas de rendimiento y seguridad, permite construir desde un bloc de notas básico hasta aplicaciones de captura de logs o notas rápidas integradas en proyectos más grandes.