Repository navigation
Soporte de operaciones con paréntesis en la calculadora GUI #44
Copy link
Copy link
Labels
funcionalidadNuevas funcionalidadesNuevas funcionalidadesguiFuncionalidades de la interfaz gráficaFuncionalidades de la interfaz gráficamejoraMejora a funciones existentesMejora a funciones existentes
Milestone
Description
🧩 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 = 202*(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
exprsolo 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
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
funcionalidadNuevas funcionalidadesNuevas funcionalidadesguiFuncionalidades de la interfaz gráficaFuncionalidades de la interfaz gráficamejoraMejora a funciones existentesMejora a funciones existentes
Activity