Ir al contenido

IDEAS PRÁCTICAS · ASIMOV INGENIERÍA

Editores de texto sencillos con Tkinter: widget Text y Scrollbar

Aprende a crear editores de texto ligeros con Tkinter usando el widget Text, cómo difiere de Entry, manipular su contenido y añadir una barra de desplazamiento. Incluye un mini bloc de notas completo con botón de borrado.

Imagen ilustrativa · AltumCode / Unsplash.

Table of contents

No titles in the blog post

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.

Representación tridimensional del logotipo de Python
Imagen ilustrativa · Rubaitul Azad / Unsplash.

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 Text con 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 ScrolledText del módulo tkinter.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 QPlainTextEdit con 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.