GRmenu
Menús de navegación por teclado para terminal, en modo TTY crudo
Flechas arriba/abajo para moverte · Enter para elegir · q para salir
✨ Características
- 🎮 Navegación con flechas — arriba/abajo para moverte,
Enterpara ejecutar,qpara salir - 🎨 20 estilos de borde — desde ASCII clásico hasta caracteres Unicode y bloques
- 🌈 Colores personalizables — borde, opciones y foco por separado, con 8 colores en 2 tonos cada uno
- 📦 Cero dependencias externas — solo la librería estándar (
io/consoleen Ruby,termios/ttyen Python) - 💎 Ruby & Python — implementaciones disponibles tanto en RubyGems (
grmenu) como en PyPI (grmenu) - 🐧 Linux / macOS — funciona en cualquier terminal POSIX
⚠️ Requiere una terminal real (TTY) en Linux o macOS. En Ruby utiliza
io/consoleen modo crudo (raw) y en Pythontermios/ttypara capturar pulsaciones de teclas en tiempo real.
📦 Instalación
Ruby (RubyGems)
gem install grmenu
O en tu Gemfile:
gem 'grmenu'
Python (PyPI)
pip install grmenu
🚀 Uso rápido (Ruby)
require 'GRmenu'
def opcion_uno
puts "elegiste uno"
end
def opcion_dos
puts "elegiste dos"
end
= GRmenu.new(
[method(:opcion_uno), method(:opcion_dos)],
title: "Mi menu",
style: 19
)
.set_style.border("yellow")
.set_style.("green")
.draw
Cada elemento de la lista puede ser un Method (method(:mi_metodo)), un Proc / lambda (-> { ... }), un arreglo ["Nombre", callable] o un Symbol (:mi_metodo). El nombre se toma automáticamente de la opción y al presionar Enter sobre ella, esa acción se ejecuta.
🐍 Ver ejemplo en Python
from GRmenu import GRmenu
def opcion_uno():
print("elegiste uno")
def opcion_dos():
print("elegiste dos")
menu = GRmenu([opcion_uno, opcion_dos], title="Mi menu", style=19)
menu.SetStyle.Border("yellow")
menu.SetStyle.Options("green")
menu.draw()
🕹️ Controles
| Tecla | Acción |
|---|---|
↑ |
Mover selección arriba |
↓ |
Mover selección abajo |
Enter |
Ejecutar opción seleccionada |
q |
Salir del menú |
🎨 Personalización
Colores (set_style / SetStyle)
Cada zona del menú se personaliza por separado. level: 1 es el tono normal y level: 2 el brillante.
# En Ruby:
.set_style.border("cyan") # color del borde
.set_style.("white") # color de las opciones no seleccionadas
.set_style.focus("green", 2) # color de la opción resaltada (brillante)
Colores disponibles: black, red, green, yellow, blue, magenta, cyan, white.
Estilos de borde (style)
El parámetro style acepta un número (1 al 20) que define cómo se dibuja el marco del menú:
style |
Vista previa | style |
Vista previa |
|---|---|---|---|
| 1 | #===# |
11 | ░░░░░ |
| 2 | ┌───┐ |
12 | █████ |
| 3 | ╔═══╗ |
13 | ***** |
| 4 | ┏━━━┓ |
14 | +++++ |
| 5 | ╒═══╕ |
15 | ===== |
| 6 | ╓───╖ |
16 | ~~~~~ |
| 7 | ╭───╮ |
17 | ----- |
| 8 | ▛▀▀▀▜ |
18 | ◆◆◆◆◆ |
| 9 | ▓▓▓▓▓ |
19 | ●●●●● (default) |
| 10 | ▒▒▒▒▒ |
20 | ★★★★★ |
= GRmenu.new([method(:opcion_uno), method(:opcion_dos)], title: "Mi menu", style: 7) # bordes redondeados
Ancho del menú
draw() acepta size_max (o min_width), el ancho mínimo en caracteres del cuadro (se expande automáticamente si el título o las opciones son más largos):
.draw(size_max: 30)
📖 Referencia de la API (Ruby)
GRmenu.new(functions, title: "", style: 19)
| Parámetro | Tipo | Descripción |
|---|---|---|
functions |
Array<Method, Proc, Symbol, Array> |
Métodos, procs o lambdas a mostrar como opciones. |
title |
String (opcional) |
Título mostrado en la cabecera del menú. |
style |
Integer (opcional) |
Número de estilo de borde (ver tabla arriba). |
menu.draw(size_max: 20)
Dibuja el menú y bloquea el hilo hasta que el usuario elige una opción (Enter) o sale (q).
menu.set_style
| Método | Descripción |
|---|---|
set_style.border(color, level=1) |
Color del marco del menú. |
set_style.options(color, level=1) |
Color de las opciones sin seleccionar. |
set_style.focus(color, level=2) |
Color de la opción resaltada. |
(Nota: también se soportan los métodos con alias menu.SetStyle.Border(...), menu.SetStyle.Options(...), menu.SetStyle.Focus(...) para compatibilidad de interfaz con la versión de Python).
🧩 Ejemplo completo (Ruby)
require 'GRmenu'
def saludar
puts "¡Hola desde Ruby!"
end
def salir_app
puts "Hasta luego 👋"
end
def acerca_de
puts "GRmenu v0.1.4 — menú TTY para terminal"
end
= GRmenu.new(
[
method(:saludar),
method(:acerca_de),
["Personalizado", -> { puts "Opción con bloque lambda" }],
method(:salir_app)
],
title: "GRmenu Demo",
style: 7
)
.set_style.border("magenta")
.set_style.("white")
.set_style.focus("cyan", 2)
.draw(size_max: 28)
🤝 Contribuir
Las contribuciones son bienvenidas. Podés abrir un issue o enviar un pull request.
📄 Licencia
Distribuido bajo licencia MIT.
Hecho por grcode