def calculate(self):
expr = self.display.get().strip()
try:
# Безопасное извлечение аргумента: убирает пробелы и скобки
def get_arg(prefix):
return expr.replace(prefix, '', 1).replace('(', '').replace(')', '').strip()
if expr.startswith(("sin", "cos", "tan")):
func_name = expr[:3]
x = float(get_arg(func_name))
x = math.radians(x) if not self.is_radians else x
result = getattr(math, func_name)(x)
elif expr.startswith(("asin", "acos", "atan")):
func_name = expr[:4]
x = float(get_arg(func_name))
result = getattr(math, func_name)(x)
if not self.is_radians:
result = math.degrees(result)
elif expr.startswith("sqrt"):
result = math.sqrt(float(get_arg("sqrt")))
elif expr.startswith("ln"):
result = math.log(float(get_arg("ln")))
elif expr.startswith("log"):
result = math.log10(float(get_arg("log")))
elif expr.startswith("exp"):
result = math.exp(float(get_arg("exp")))
elif expr.startswith("comb"):
inner = get_arg("comb")
parts = [p.strip() for p in inner.split(",")]
if len(parts) != 2:
raise ValueError("Формат: comb(n, m)")
n, m = int(float(parts[0])), int(float(parts[1]))
if not (0 <= m <= n):
raise ValueError("Для C(n,m) должно быть: 0 ≤ m ≤ n")
result = math.comb(n, m)
else:
result = eval(expr)
self.display.delete(0, tk.END)
self.display.insert(0, f"{result:.{self.precision}f}")
except ZeroDivisionError:
self.display.delete(0, tk.END)
self.display.insert(0, "Деление на ноль")
except ValueError as e:
self.display.delete(0, tk.END)
self.display.insert(0, str(e))
except Exception as e:
# Показываем реальную ошибку вместо общего "Неверное выражение"
messagebox.showerror("Ошибка", f"Тип: {type(e).__name__}\n{str(e)}")