08/09/2025
Python curses es un poderoso módulo que permite a los programadores crear interfaces de usuario basadas en texto (TUI) para aplicaciones en la terminal. A pesar de la proliferación de interfaces gráficas, curses sigue siendo relevante en entornos específicos, como sistemas embebidos, instaladores de sistemas operativos y herramientas que deben funcionar antes de que esté disponible el soporte gráfico. Este artículo proporciona una introducción exhaustiva a Python curses, cubriendo desde la inicialización básica hasta conceptos avanzados como pads y manejo de eventos del mouse.

¿Qué es Python curses ?
La librería curses proporciona una funcionalidad de dibujo de pantalla y manejo de teclado independiente del terminal. Abstrae las complejidades de los códigos de control de diferentes terminales, permitiendo al programador interactuar con la pantalla de una manera consistente. Aunque las terminales de texto son una tecnología obsoleta en la mayoría de los contextos, curses sigue siendo invaluable en situaciones donde las interfaces gráficas no son viables.
Curses se basa en ncurses, una implementación de código abierto de la interfaz AT&T. La mayoría de los sistemas Unix modernos (Linux, FreeBSD) utilizan ncurses. En Windows, se requiere una versión portada, como UniCurses. El módulo Python curses es un envoltorio sobre las funciones C de ncurses, simplificando su uso en Python.
Comenzando y Terminando una Aplicación Curses
Antes de comenzar a trabajar con curses, debe inicializarse llamando a la función initscr(). Esta función determina el tipo de terminal, envía los códigos de configuración necesarios y crea las estructuras de datos internas. initscr()devuelve un objeto windowque representa toda la pantalla, usualmente llamado stdscr.
Para una experiencia de usuario más fluida, se suelen desactivar las opciones de eco automático y se activa el modo cbreakpara una respuesta inmediata a las pulsaciones de teclas. Esto se logra con las funciones noecho()y cbreak()respectivamente. También se activa el modo keypadpara un manejo eficiente de las secuencias de escape de teclas especiales.
La terminación de una aplicación curses implica invertir estas configuraciones usando nocbreak(), keypad(False), y echo(). Finalmente, se llama a endwin()para restaurar el terminal a su estado original. Para simplificar el manejo de excepciones y asegurar la restauración del terminal, se recomienda usar la función curses.wrapper(), que maneja la inicialización y la limpieza del terminal incluso en caso de errores.
Ventanas y Pads
Las ventanas son la abstracción básica en curses. Un objeto windowrepresenta un área rectangular de la pantalla y proporciona métodos para mostrar texto, borrarlo, y manejar la entrada del usuario. stdscres una ventana que cubre toda la pantalla. Se pueden crear ventanas adicionales usando newwin(), especificando altura, anchura, y coordenadas.
El sistema de coordenadas de curses es inusual: las coordenadas se pasan en orden y,x, con (0,0) en la esquina superior izquierda. Las variables curses.LINESy curses.COLSproporcionan las dimensiones de la pantalla.
Los cambios en una ventana no se reflejan inmediatamente en la pantalla. Es necesario llamar al método refresh()para actualizar la pantalla. Para un rendimiento óptimo con múltiples ventanas, se puede usar noutrefresh()para actualizar una estructura de datos interna y luego doupdate()para actualizar la pantalla físicamente. Los pads son un tipo especial de ventana que puede ser más grande que la pantalla, permitiendo la visualización de una parte del pad en un momento dado. Se crean con newpad()y se actualizan con refresh(), especificando el área de la pantalla a actualizar y la sección del pad a mostrar.
Mostrando Texto
El módulo Python curses simplifica la interacción con la pantalla. Los métodos como addstr()permiten mostrar texto en diferentes formas, incluyendo la especificación de atributos y coordenadas. Los atributos permiten mostrar texto en negrita, subrayado, en modo inverso, o con color. addch()permite mostrar caracteres individuales, incluyendo caracteres especiales definidos en curses.
Atributos y Color
Los atributos modifican la apariencia del texto. Cada atributo es un entero, con cada bit representando un atributo diferente. Se pueden combinar atributos usando la operación bit a bit OR ( |). Curses también soporta color en terminales compatibles. Se debe llamar a start_color()para inicializar el soporte de color. init_pair()define una pareja de color (color de primer plano y color de fondo).
Los colores son numerados, comenzando con 0 (negro) hasta 7 (blanco). Curses define constantes para cada color. can_change_color()indica si la terminal permite cambiar la definición de los colores RGB.
Entrada del Usuario
Curses ofrece métodos simples para obtener entrada del usuario. getch()lee un carácter, mientras que getkey()devuelve una cadena con el carácter o el nombre de la tecla especial. nodelay()permite que getch()y getkey()funcionen en modo no bloqueante. getstr()lee una cadena completa, pero con funcionalidad limitada. El módulo curses.textpadproporciona una caja de texto con soporte para edición con enlaces de teclas estilo Emacs.
Instalación de Curses en Python
En sistemas Unix, curses está generalmente incluido. Para Windows, se necesita instalar el módulo windows-cursesusando pip install windows-curses. Alternativamente, se puede usar WSL (Windows Subsystem for Linux).
Ejemplo de Aplicación Curses
A continuación, se muestra un ejemplo simple de una aplicación curses que muestra texto en la pantalla:
import curses
from curses import wrapper
def main(stdscr):
stdscr.clear()
stdscr.addstr(10, 20, 'Hola, curses!')
stdscr.refresh()
stdscr.getch()
wrapper(main)
Este código limpia la pantalla, muestra el texto "Hola, curses!" en las coordenadas (10, 20) y espera a que el usuario presione una tecla. wrapper()se encarga de la inicialización y la terminación de curses.
Python curses es una herramienta flexible y potente para desarrollar interfaces de usuario basadas en texto. Aunque las interfaces gráficas son predominantes, curses sigue siendo una opción valiosa en ciertos contextos. Su comprensión proporciona una base sólida para la creación de aplicaciones interactivas en la terminal. Este artículo ha cubierto los aspectos fundamentales de curses, proporcionando una información para principiantes y desarrolladores con experiencia. Recuerda explorar la documentación oficial para descubrir más funcionalidades y profundizar en el manejo de este potente módulo.
Si quieres conocer otros artículos parecidos a Python curses para interfaces de texto puedes visitar la categoría Curso.
