Editores de texto sencillos con Tkinter: Text y Scrollbar
Tkinter es la biblioteca estándar de Python para crear interfaces gráficas (GUI). Aunque su apariencia es básica, ofrece todos los widgets necesarios para construir aplicaciones útiles rápidamente. En este artículo veremos cómo crear un editor de texto simple usando los widgets Text y Scrollbar, y compararemos Text con el más conocido Entry.
Widget Entry
- Diseñado para una sola línea de texto.
- Ideal para campos como username, password, search bar.
- Propiedad
show='*'permite ocultar caracteres (útil para contraseñas). - Limitado en operaciones de formato; solo texto plano.
Widget Text
- Soporta texto multilínea con salto de línea automático.
- Permite etiquetas, fuentes y colores por rango de caracteres.
- Incluye funcionalidades avanzadas:
undo,redo,clipboard,tag_config. - Requiere un
Scrollbarexterno para navegación cuando el contenido supera el área visible.
Insertar, leer y borrar texto en Text
El widget Text usa índices tipo line.column (por ejemplo, 1.0 = primera línea, columna 0). Los métodos más usados son:
# Insertar texto al final
text_widget.insert(tk.END, "Hola mundo\n")
# Insertar en una posición específica
text_widget.insert('2.5', 'texto en la línea 2, columna 5')
# Obtener todo el contenido
contenido = text_widget.get('1.0', tk.END) # Incluye salto final
# Obtener solo una parte
parcial = text_widget.get('3.0', '3.end') # Línea 3 completa
# Borrar rango
text_widget.delete('1.0', tk.END) # Vacía el widget
Consejo de rendimiento: Si vas a insertar o eliminar grandes bloques de texto, desactiva temporalmente la actualización visual con text_widget.configure(state='disabled') y vuelve a activarla al terminar.
Cómo conectar un Scrollbar al widget Text
El Scrollbar debe estar configurado para controlar el yscrollcommand del Text y a la inversa, el Text debe notificar al Scrollbar mediante su método set:
scroll = tk.Scrollbar(root, orient='vertical')
text = tk.Text(root, yscrollcommand=scroll.set)
scroll.config(command=text.yview)
Con orient='horizontal' puedes crear una barra horizontal y enlazarla con text.xview.
Ejemplo práctico: mini bloc de notas con botón "Limpiar"
El siguiente script muestra una ventana con:
- Un
Textde dimensiones ajustables. - Una
Scrollbarvertical conectada. - Un botón Limpiar que borra todo el contenido.
- Opciones de deshacer/rehacer activadas.
import tkinter as tk
from tkinter import messagebox
class MiniNotepad(tk.Tk):
def __init__(self):
super().__init__()
self.title("Mini Bloc de Notas – Tkinter")
self.geometry("600x400")
self.configure(bg='#f8f9fa')
self._create_widgets()
def _create_widgets(self):
# Frame contenedor para Text + Scrollbar
frame = tk.Frame(self, bg='#f8f9fa')
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# Scrollbar vertical
v_scroll = tk.Scrollbar(frame, orient='vertical')
v_scroll.pack(side=tk.RIGHT, fill=tk.Y)
# Widget Text con undo habilitado
self.text = tk.Text(
frame,
wrap='word',
undo=True,
yscrollcommand=v_scroll.set,
font=('Consolas', 11),
bg='white',
relief=tk.SUNKEN,
borderwidth=2
)
self.text.pack(fill=tk.BOTH, expand=True)
v_scroll.config(command=self.text.yview)
# Botón limpiar
btn_clear = tk.Button(
self,
text='Limpiar',
command=self._clear_text,
bg='#dc3545',
fg='white',
activebackground='#c82333',
relief=tk.RAISED,
padx=10,
pady=5
)
btn_clear.pack(pady=(0,10))
# Bind teclas rápidas
self.bind_all('', self._save_placeholder)
self.bind_all('', lambda e: self.text.edit_undo())
self.bind_all('', lambda e: self.text.edit_redo())
def _clear_text(self):
if messagebox.askyesno('Confirmar', '¿Deseas borrar todo el contenido?'):
self.text.delete('1.0', tk.END)
def _save_placeholder(self, event=None):
# Aquí podrías implementar guardado a archivo
messagebox.showinfo('Guardar', 'Funcionalidad de guardado no implementada.')
if __name__ == '__main__':
app = MiniNotepad()
app.mainloop()
Ejecuta el script y tendrás un editor funcional. Puedes ampliar la aplicación añadiendo:
- Menú
Archivo → Abrir / Guardarconfiledialog. - Resaltado de sintaxis usando
tag_config. - Soporte para temas oscuros mediante variables de estilo.
Buenas prácticas, rendimiento y solución de problemas
Rendimiento
- Evita cargar textos gigantes (más de 1 MB) directamente en
Text; usa paginación o carga diferida. - Utiliza
.see(index)para desplazar el cursor sin forzar redibujos completos.
Seguridad
- Si tu aplicación permite pegar contenido externo, limpia caracteres de control con
re.sub(r'\x00-\x1F', '', texto)antes de insertarlo. - Desactiva la edición (
state='disabled') cuando muestres contenido que el usuario no debe modificar.
Depuración frecuente
| Problema | Posible causa | Solución |
|---|---|---|
| Scrollbar no se mueve | Olvidaste enlazar command=text.yview | Asegúrate de llamar scroll.config(command=text.yview) |
Texto desaparece al hacer insert | Estás usando END-1c en vez de END | Utiliza siempre tk.END o calcula el índice correcto |
| El widget se vuelve lento al escribir | Muchos tag_config dinámicos | Consolida tags y actualiza en bloque usando text.after_idle() |
Compatibilidad, rendimiento y escalabilidad
El widget Text está disponible en todas las plataformas soportadas por Tkinter (Windows, macOS, Linux). No depende de versiones específicas de Python; funciona desde 3.6 en adelante.
Para aplicaciones que requieran alta escalabilidad (p.ej., editores de código con miles de líneas), considera alternativas como QScintilla o GtkSourceView. Sin embargo, para notas rápidas, scripts internos o herramientas de depuración, Text sigue siendo la opción más ligera y sin dependencias externas.
Con Text y Scrollbar puedes crear editores de texto funcionales en minutos, manteniendo una base de código limpia y portable. Experimenta añadiendo menús, resaltado de sintaxis y guardado automático para convertir este mini bloc de notas en una herramienta de productividad personal.
7 Editores de texto sencillos con Tkinter: Text y Scrollbar