Skip to content

feat: agregar soporte de teclado para calculadora GUI - #47

Merged
jandrescodes merged 3 commits into
devfrom
feature/keyboard-support
Nov 28, 2025
Merged

feat: agregar soporte de teclado para calculadora GUI#47
jandrescodes merged 3 commits into
devfrom
feature/keyboard-support

Conversation

@jandrescodes

Copy link
Copy Markdown
Contributor

📋 Descripción

Implementación de soporte completo de teclado para la calculadora GUI. Los usuarios ahora pueden usar la calculadora mediante el teclado además de los clicks del mouse, mejorando significativamente la experiencia de usuario y accesibilidad.

🔗 Issue Relacionado

Related to #37

🎯 Objetivo

Mejorar la experiencia de usuario permitiendo la entrada mediante teclado. Los usuarios pueden ingresar números, operadores y ejecutar cálculos usando únicamente el teclado, haciendo la calculadora más accesible y eficiente para usuarios avanzados.


💻 Implementación

Archivos Modificados

  • gui.py - Agregado método handle_keypress y binding de eventos de teclado
  • gui. py - Mejorado sistema de mensajes de error con label separado
  • gui.py - Agregadas validaciones de entrada para prevenir errores

Cambios Técnicos

1. Binding de eventos de teclado en __init__:

# Activar captura de teclado
self. root.bind('<Key>', self.handle_keypress)

2. Nuevo método para manejar teclas:

def handle_keypress(self, event):
    """Maneja las teclas presionadas por el usuario. 
    
    Mapea las teclas del teclado a las funciones de la calculadora.
    """
    key = event.char
    
    # Dígitos 0-9
    if key. isdigit():
        self. number_button_click(key)
    
    # Operadores básicos
    elif key in ['+', '-', '*', '/']:
        self.operation_click(key)
    
    # Potencia
    elif key == '^':
        self.operation_click('^')
    
    # Decimal
    elif key == '.':
        self.decimal_click()
    
    # Calcular (Enter o =)
    elif key in ['\r', '\n', '=']:
        self.equals_click()
    
    # Limpiar todo (Escape)
    elif event.keysym == 'Escape':
        self.clear_click()
    
    # Borrar último carácter (Backspace)
    elif event.keysym == 'BackSpace':
        self.backspace_click()

3. Label separado para errores:

# Label para mensajes de error
self.error_label = tk.Label(
    self.root,
    text="",
    font=("Arial", 10),
    bg=COLORS["bg"],
    fg=COLORS["error"],
    height=1
)

4. Validaciones mejoradas:

# En number_button_click
if not str(valor).isdigit():
    return

# En decimal_click
if self.current_value and self.current_value != '-':
    try:
        float(self.current_value)
    except ValueError:
        self.show_error("Número inválido")
        return

🧪 Testing

Casos de Prueba

  • Ingresar números con teclado: 2, 3, 5 → Display: "235"
  • Operación completa: 5, +, 3, Enter → Display: "8"
  • Punto decimal: 3, . , 5 → Display: "3.5"
  • Limpiar con Escape funciona correctamente
  • Backspace elimina último carácter
  • Combinación mouse + teclado funciona correctamente
  • Operaciones encadenadas: 5, +, 3, +, 2, Enter → Display: "10"
  • Mensajes de error se muestran en label separado
  • Display se limpia al mostrar error
  • Validación de entrada previene texto inválido

Prueba Manual

python gui.py
# Usar solo el teclado para realizar cálculos
# Probar combinación de mouse y teclado
# Verificar mensajes de error

📝 Documentación

  • Docstring agregado al método handle_keypress
  • Ejemplos de uso en docstrings
  • Comentarios en código actualizados para sonar más naturales
  • README.md actualización pendiente con atajos de teclado

✅ Checklist de Feature

  • Función implementada correctamente
  • Binding de teclado funciona para todos los casos
  • Sistema de errores mejorado con label separado
  • Validaciones de entrada implementadas
  • Documentación en código actualizada
  • Code review solicitado
  • Sin conflictos con dev
  • Commits claros y descriptivos

🎹 Atajos de Teclado Implementados

Tecla Acción
0-9 Ingresar dígitos
. Punto decimal
+ Suma
- Resta
* Multiplicación
/ División
^ Potencia
Enter o = Calcular resultado
Escape Limpiar display
Backspace Borrar último carácter

🐛 Bugs Corregidos

  • ✅ Corregidos espacios extra en métodos que impedían el funcionamiento del botón "0"
  • ✅ Display ahora se limpia completamente al mostrar errores
  • ✅ Validaciones agregadas para prevenir entrada de texto inválido

👥 Revisores

Por favor revisar la implementación del soporte de teclado y el sistema mejorado de mensajes de error.
@Jhos3ph @alexricardotapiacarita-ai

@jandrescodes jandrescodes self-assigned this Nov 27, 2025
@jandrescodes jandrescodes added documentación Cambios en README, docstrings, etc. mejora Mejora a funciones existentes ayuda requerida Se necesita asistencia o revisión funcionalidad Nuevas funcionalidades en progreso Tarea que está siendo trabajada gui Funcionalidades de la interfaz gráfica labels Nov 27, 2025
@jandrescodes jandrescodes linked an issue Nov 27, 2025 that may be closed by this pull request
17 tasks
Comment thread gui.py Outdated
Comment on lines +33 to +36
# ==== DISPLAY ====
self.display = tk.Entry(
# Display principal
self.display = tk. Entry(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

que diferencia hace el tk.Entry( ) con tk. Entry( ) ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Es un error que estaba corrigiendo y revisando vi que hay más espacios, pero ya lo estoy corrigiendo.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ah o sea el que esta mal es tk.Entry( )?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahhhh ya entendí xd
lol, github me aviso que agregaste un nuevo commit para corregir los errores que te mencione

@Jhos3ph Jhos3ph left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Buena implementancion de la entrada del tecledo para la calculadora
Los try except faltantes en ciertas zonas donde pueden ocurrir resultados no deseados (errores) es un muy buen aporte
La eliminacion de comentarios hace del codigo mas tranquilo

@jandrescodes
jandrescodes merged commit 9a56e17 into dev Nov 28, 2025
2 checks passed
@jandrescodes
jandrescodes deleted the feature/keyboard-support branch November 30, 2025 17:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ayuda requerida Se necesita asistencia o revisión documentación Cambios en README, docstrings, etc. en progreso Tarea que está siendo trabajada funcionalidad Nuevas funcionalidades gui Funcionalidades de la interfaz gráfica mejora Mejora a funciones existentes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Agregar soporte de teclado para calculadora GUI

2 participants