Skip to content

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

@Jandres25

Description

@Jandres25

🧩 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

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