Загрузка данных


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)}")