Skip to content

Soporte de operaciones con paréntesis en la calculadora GUI #44

Description

@jandrescodes

🧩 Descripción

La calculadora gráfica muestra botones para paréntesis "(" y ")", pero no existe soporte programático para realizar operaciones matemáticas con paréntesis desde la interfaz. Se requiere implementar procesamiento de expresiones con paréntesis en el GUI.

Ejemplos de operaciones esperadas:

  • (2+3)*4 = 20
  • 2*(3+4) = 14
  • (5-2)*(6+4) = 30
  • (10/2)+5 = 10

👨‍💻 Código de ejemplo detallado para evaluar expresiones con paréntesis

# Ejemplo de implementación en la clase CalculatorGUI:

class CalculatorGUI:
    def __init__(self, root):
        # ...
        self.expression = ""  # Donde se construye la expresión

    def number_button_click(self, valor):
        self.expression += str(valor)
        self.update_display(self.expression)

    def operation_click(self, op):
        self.expression += op
        self.update_display(self.expression)

    def open_parenthesis_click(self):
        self.expression += '(' 
        self.update_display(self.expression)

    def close_parenthesis_click(self):
        self.expression += ')'
        self.update_display(self.expression)

    def equals_click(self):
        try:
            # Reemplazar operaciones como ^ por ** si lo usas
            expr = self.expression.replace('^', '**')
            # Validar paréntesis balanceados:
            if expr.count('(') != expr.count(')'):
                self.show_error('Paréntesis desbalanceados')
                return
            # IMPORTANTE: Eval solo para expresiones seguras (números y operadores)
            result = eval(expr)
            self. update_display(str(result))
            self.expression = str(result)
        except Exception as e:
            self.show_error(f"Error en la expresión: {e}")

    def update_display(self, valor):
        self.display.delete(0, tk.END)
        self.display.insert(0, valor)

    def show_error(self, msg):
        self.display.delete(0, tk.END)
        self.display.insert(0, f"Error: {msg}")
  • Puedes adaptar este ejemplo para integrar con el resto de la lógica. Es recomendable (por seguridad) validar que el string expr solo contenga dígitos, operadores aceptados, paréntesis y punto decimal.
  • Si deseas evitar riesgos y hacer parsing propio, puedes implementar el algoritmo de Shunting Yard (ver [Wikipedia](https://es. wikipedia.org/wiki/Algoritmo_shunting_yard)) y la evaluación de postfijo.

📋 Tareas

  • Permitir al usuario construir y mostrar expresiones con paréntesis en el display.
  • Procesar y evaluar la expresión introducida por el usuario al presionar =.
  • Validar que los paréntesis estén bien balanceados antes de evaluar.
  • Mostrar el resultado en la interfaz gráfica.
  • Manejar errores y expresiones inválidas correctamente.
  • Agregar tests de GUI para operaciones con paréntesis.
  • Documentar esta nueva funcionalidad en el README.

💡 Sugerencias y recursos

  • Métodos recomendados: open_parenthesis_click(), close_parenthesis_click() para los botones.
  • Modificar equals_click() para evaluar la expresión completa.
  • Si usas eval(), valida la expresión antes de evaluar. Ejemplo: regex para aceptar sólo caracteres válidos.
  • Considera implementar el algoritmo Shunting Yard para robustez y seguridad.
  • Ver bugs y mejoras relacionados a expresiones complejas en: Error: Difícil ingresar múltiples números negativos en operaciones #43

🏷️ Etiquetas

mejora, funcionalidad, gui

Activity

  1. added
    mejoraMejora a funciones existentes
    guiFuncionalidades de la interfaz gráfica
    on Nov 26, 2025
  2. added this to the v2.1.0 milestone on Nov 30, 2025
  3. self-assigned this
    on Dec 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

funcionalidadNuevas funcionalidadesguiFuncionalidades de la interfaz gráficamejoraMejora a funciones existentes

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions