14/01/2025
La librería Curses en Python proporciona una poderosa herramienta para la creación de interfaces de usuario basadas en texto (TUI). Aunque la tecnología de terminales de texto puede parecer obsoleta en la era de las interfaces gráficas, Curses sigue siendo relevante en diversos contextos, especialmente en sistemas embebidos, instaladores de sistemas operativos y herramientas que deben funcionar antes de que esté disponible el soporte gráfico. Esta tutorial profundiza en las capacidades de Curses, ofreciendo una visión completa de su funcionamiento y posibilidades.

Qué es Curses en Python
Curses es un módulo de extensión que permite controlar de manera eficiente la visualización en terminales de texto. Proporciona funcionalidades para pintar la pantalla, manejar el teclado y gestionar ventanas de texto, ofreciendo una abstracción del terminal subyacente. Esto significa que el programador puede interactuar con la pantalla de forma independiente del tipo de terminal utilizado, simplificando el desarrollo de aplicaciones multiplataforma (siempre y cuando curses este soportado).
Curses en Python se basa en la librería ncurses, una implementación de código abierto de la interfaz AT&T System V. Si bien existen diferencias entre las versiones BSD y System V, la mayoría de los sistemas operativos modernos (incluyendo Linux y FreeBSD) utilizan ncurses, asegurando la compatibilidad de las funciones descritas en este documento. Cabe destacar que la versión de Python para Windows no incluye el módulo Curses de forma nativa; sin embargo, existen puertos como UniCurses disponibles.
Iniciando y Finalizando una Aplicación Curses
Antes de comenzar a usar Curses, es necesario inicializarlo 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()retorna un objeto windowque representa toda la pantalla, comúnmente llamado stdscr.
import cursesstdscr = curses.initscr()Para una mejor interacción, es habitual desactivar el eco automático de las teclas con noecho()y habilitar el modo cbreakpara una respuesta instantánea a las pulsaciones de teclas, sin necesidad de presionar Enter.

curses.noecho()curses.cbreak()Además, para manejar correctamente las secuencias de escape de las teclas especiales, se activa el modo keypad.
stdscr.keypad(True)Para finalizar la aplicación Curses, se deben revertir los ajustes del terminal y restaurar su estado original llamando a las funciones nocbreak(), keypad(False), echo()y endwin().
curses.nocbreak()stdscr.keypad(False)curses.echo()curses.endwin()Para facilitar la depuración, se recomienda utilizar la función curses.wrapper(), que maneja la inicialización y la restauración del estado del terminal, incluso en caso de excepciones.
from curses import wrapperdef main(stdscr): # ...código de la aplicación...wrapper(main)Ventanas y Pads
Las ventanas ( windows) son la unidad básica de Curses. Un objeto windowrepresenta un área rectangular de la pantalla y permite mostrar texto, borrarlo, obtener entrada del usuario, etc. stdscres una ventana que cubre toda la pantalla. La función newwin()crea nuevas ventanas de un tamaño específico.
begin_x = 20; begin_y = 7height = 5; width = 40win = curses.newwin(height, width, begin_y, begin_x)Es importante notar que el sistema de coordenadas de Curses es inverso al convencional (y, x). Las variables curses.LINESy curses.COLSindican el tamaño de la pantalla.
Para mostrar los cambios en la pantalla, se debe llamar al método refresh()del objeto window. Los Pads son ventanas especiales que pueden ser más grandes que la pantalla y solo muestran una parte a la vez. Su uso es ideal para manejar grandes cantidades de texto.

pad = curses.newpad(100, 100)# ...código para llenar el pad...pad.refresh(0, 0, 5, 5, 20, 75)Mostrando Texto
El método addstr()muestra texto en una ventana. Soporta diferentes formas de invocación, permitiendo especificar coordenadas (y, x) y atributos (como negrita, subrayado o color).
stdscr.addstr(0, 0, "Texto", curses.A_BOLD) addch()muestra un carácter, mientras que move(y, x)mueve el cursor a una posición específica. curs_set(False)oculta el cursor.

Atributos y Color
Curses permite mostrar texto con diferentes atributos, combinando bits para lograr efectos como negrita, subrayado, inverso, parpadeo, etc. El soporte de color requiere llamar a start_color()y verificar la disponibilidad con has_colors(). init_pair(n, f, b)define la pareja de color n con color de primer plano f y color de fondo b.
curses.start_color()curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)stdscr.addstr("Texto rojo", curses.color_pair(1))Entrada del Usuario
getch()obtiene un carácter del usuario, mientras que getkey()lo devuelve como una cadena. nodelay(True)hace que getch()no bloquee la ejecución. getstr()obtiene una cadena completa, con funciones limitadas de edición.
El módulo curses.textpadofrece un widget de caja de texto con soporte para atajos de teclado tipo Emacs.
Instalación de Curses en Python
En sistemas Unix, Curses está incluido por defecto. En Windows, se debe instalar el paquete windows-cursesusando pip:
pip install windows-cursesSe recomienda utilizar un entorno virtual para aislar las dependencias del proyecto.
Ejemplos de Uso de stdscr
stdscres el objeto ventana principal de Curses. Todos los elementos se dibujan en esta ventana, o en subventanas que se crean dentro de ella. A continuación, se muestra un ejemplo básico de uso:
import cursesfrom curses import wrapperdef main(stdscr): stdscr.clear() stdscr.addstr(10, 10, "Hola, entorno!") stdscr.refresh() stdscr.getch()wrapper(main)Este código limpia la pantalla, escribe "Hola, entorno!" en las coordenadas (10, 10) y espera a que el usuario presione una tecla.
Consultas Habituales
A continuación, se responden algunas de las consultas más frecuentes sobre la librería Curses en Python :
¿Cómo manejar eventos del ratón?
Para manejar eventos del ratón, se debe utilizar curses.mousemask(curses.ALL_MOUSE_EVENTS)para habilitar la captura de eventos del ratón y luego verificar si curses.getmouse()devuelve un evento de ratón.
Los menús se pueden crear utilizando bucles y gestionando la entrada del usuario con getch()para navegar entre las opciones y ejecutar acciones correspondientes.
¿Cómo crear ventanas desplazables?
Para crear ventanas desplazables se utilizan los Pads. Estos permiten manejar áreas de texto más grandes que la pantalla, mostrando solo una porción a la vez, y gestionando el desplazamiento con pad.refresh().
¿Cómo manejar colores y atributos?
Para usar colores, se debe llamar a curses.start_color()y definir las parejas de color con init_pair(). Luego, al usar addstr(), se especifican las parejas de color usando curses.color_pair(n)y atributos como curses.A_BOLD, curses.A_REVERSE, etc. combinados con el operador |.
Tabla Comparativa de Funciones Curses
| Función | Descripción |
|---|---|
initscr() | Inicializa la librería Curses. |
endwin() | Finaliza la librería Curses. |
newwin(nlines, ncols, begy, begx) | Crea una nueva ventana. |
addstr(str) | Escribe una cadena en la ventana actual. |
addch(ch) | Escribe un carácter en la ventana actual. |
refresh() | Actualiza la pantalla. |
getch() | Lee un carácter de la entrada del usuario. |
getkey() | Lee una tecla de la entrada del usuario. |
noecho() | Desactiva el eco de las teclas. |
echo() | Activa el eco de las teclas. |
cbreak() | Habilita el modo cbreak. |
nocbreak() | Desactiva el modo cbreak. |
start_color() | Inicializa el soporte de color. |
init_pair(n, f, b) | Define una pareja de color. |
color_pair(n) | Retorna el atributo de color para la pareja n. |
Conclusión
La librería Curses ofrece un conjunto de herramientas robustas y flexibles para el desarrollo de interfaces de usuario basadas en texto en Python. Su sencillez en la interacción con la terminal, combinada con sus amplias funcionalidades, la convierte en una opción ideal para diversas aplicaciones, desde herramientas de sistema hasta juegos sencillos. La comprensión de sus conceptos básicos, como ventanas, pads, atributos y manejo de entrada, permite la creación de aplicaciones interactivas y eficientes.
Si quieres conocer otros artículos parecidos a Librería curses python puedes visitar la categoría Libros y Librerías.
