import tkinter as tk
from tkinter import ttk
import math


class MultiStyleCalculator:
    def __init__(self, root):
        self.root = root
        self.root.title("多界面计算器")
        self.root.geometry("400x500")
        self.root.resizable(False, False)

        # 存储当前显示的界面类型
        self.current_style = "basic"

        # 初始化变量
        self.expression = ""
        self.result_var = tk.StringVar()
        self.result_var.set("0")

        # 创建主容器
        self.main_frame = ttk.Frame(root)
        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        # 先加载基础界面
        self.load_basic_style()

    def load_basic_style(self):
        """加载基础简约版计算器界面"""
        # 清空当前界面
        self.clear_frame()
        self.current_style = "basic"

        # 1. 显示框
        display_frame = ttk.Frame(self.main_frame)
        display_frame.pack(fill=tk.X, pady=(0, 10))

        display = ttk.Entry(
            display_frame,
            textvariable=self.result_var,
            font=("Arial", 20),
            justify=tk.RIGHT,
            state="readonly"
        )
        display.pack(fill=tk.X, ipady=10)

        # 2. 功能切换按钮
        switch_frame = ttk.Frame(self.main_frame)
        switch_frame.pack(fill=tk.X, pady=(0, 10))

        ttk.Button(switch_frame, text="基础版", command=self.load_basic_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)
        ttk.Button(switch_frame, text="科学版", command=self.load_scientific_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)
        ttk.Button(switch_frame, text="复古版", command=self.load_retro_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)

        # 3. 数字和运算符按钮
        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '+'
        ]

        button_frame = ttk.Frame(self.main_frame)
        button_frame.pack(fill=tk.BOTH, expand=True)

        # 生成按钮网格
        row, col = 0, 0
        for btn_text in buttons:
            ttk.Button(
                button_frame,
                text=btn_text,
                command=lambda x=btn_text: self.on_button_click(x),
                style="Basic.TButton",
                padding=10
            ).grid(row=row, column=col, sticky="nsew", padx=2, pady=2)

            col += 1
            if col > 3:
                col = 0
                row += 1

        # 清除按钮
        ttk.Button(
            button_frame,
            text="C",
            command=self.clear_expression,
            style="Clear.TButton",
            padding=10
        ).grid(row=row, column=0, columnspan=4, sticky="nsew", padx=2, pady=2)

        # 配置网格权重（让按钮自适应大小）
        for i in range(4):
            button_frame.grid_columnconfigure(i, weight=1)
        for i in range(row + 1):
            button_frame.grid_rowconfigure(i, weight=1)

    def load_scientific_style(self):
        """加载科学计算版计算器界面"""
        # 清空当前界面
        self.clear_frame()
        self.current_style = "scientific"

        # 1. 显示框
        display_frame = ttk.Frame(self.main_frame)
        display_frame.pack(fill=tk.X, pady=(0, 10))

        display = ttk.Entry(
            display_frame,
            textvariable=self.result_var,
            font=("Arial", 18),
            justify=tk.RIGHT,
            state="readonly"
        )
        display.pack(fill=tk.X, ipady=10)

        # 2. 功能切换按钮
        switch_frame = ttk.Frame(self.main_frame)
        switch_frame.pack(fill=tk.X, pady=(0, 10))

        ttk.Button(switch_frame, text="基础版", command=self.load_basic_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)
        ttk.Button(switch_frame, text="科学版", command=self.load_scientific_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)
        ttk.Button(switch_frame, text="复古版", command=self.load_retro_style).pack(
            side=tk.LEFT, fill=tk.X, expand=True, padx=2)

        # 3. 科学计算按钮（第一行）
        sci_buttons1 = ['sin', 'cos', 'tan', '√', '^2']
        sci_frame1 = ttk.Frame(self.main_frame)
        sci_frame1.pack(fill=tk.X)

        for btn_text in sci_buttons1:
            ttk.Button(
                sci_frame1,
                text=btn_text,
                command=lambda x=btn_text: self.on_scientific_click(x),
                padding=5
            ).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=1, pady=1)

        # 4. 数字和运算符按钮
        num_buttons = [
            '7', '8', '9', '/', '(',
            '4', '5', '6', '*', ')',
            '1', '2', '3', '-', 'π',
            '0', '.', '=', '+', 'e'
        ]

        num_frame = ttk.Frame(self.main_frame)
        num_frame.pack(fill=tk.BOTH, expand=True)

        row, col = 0, 0
        for btn_text in num_buttons:
            ttk.Button(
                num_frame,
                text=btn_text,
                command=lambda x=btn_text: self.on_button_click(x),
                padding=10
            ).grid(row=row, column=col, sticky="nsew", padx=1, pady=1)

            col += 1
            if col > 4:
                col = 0
                row += 1

        # 清除按钮
        ttk.Button(
            num_frame,
            text="C",
            command=self.clear_expression,
            padding=10
        ).grid(row=row, column=0, columnspan=5, sticky="nsew", padx=1, pady=1)

        # 配置网格权重
        for i in range(5):
            num_frame.grid_columnconfigure(i, weight=1)
        for i in range(row + 1):
            num_frame.grid_rowconfigure(i, weight=1)

    def load_retro_style(self):
        """加载复古风格计算器界面"""
        # 清空当前界面
        self.clear_frame()
        self.current_style = "retro"

        # 1. 复古风格的显示框（模拟老式液晶屏）
        display_frame = tk.Frame(self.main_frame, bg="#000", padx=5, pady=5)
        display_frame.pack(fill=tk.X, pady=(0, 10))

        display = tk.Entry(
            display_frame,
            textvariable=self.result_var,
            font=("Courier", 22),
            justify=tk.RIGHT,
            state="readonly",
            bg="#8FBC8F",
            fg="#000",
            relief=tk.FLAT,
            bd=0
        )
        display.pack(fill=tk.X, ipady=10)

        # 2. 功能切换按钮（复古样式）
        switch_frame = tk.Frame(self.main_frame, bg="#D3D3D3")
        switch_frame.pack(fill=tk.X, pady=(0, 10))

        tk.Button(switch_frame, text="基础版", command=self.load_basic_style, bg="#F5F5F5",
                  relief=tk.RAISED).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2, pady=2)
        tk.Button(switch_frame, text="科学版", command=self.load_scientific_style, bg="#F5F5F5",
                  relief=tk.RAISED).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2, pady=2)
        tk.Button(switch_frame, text="复古版", command=self.load_retro_style, bg="#F5F5F5",
                  relief=tk.RAISED).pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2, pady=2)

        # 3. 复古按钮（模拟实体按键）
        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '+'
        ]

        button_frame = tk.Frame(self.main_frame, bg="#D3D3D3")
        button_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        row, col = 0, 0
        for btn_text in buttons:
            # 运算符和等号用不同颜色区分
            bg_color = "#FF6347" if btn_text in [
                '+', '-', '*', '/', '='] else "#FFFFFF"
            tk.Button(
                button_frame,
                text=btn_text,
                command=lambda x=btn_text: self.on_button_click(x),
                bg=bg_color,
                font=("Arial", 14),
                relief=tk.RAISED,
                bd=3,
                padx=5,
                pady=5
            ).grid(row=row, column=col, sticky="nsew", padx=3, pady=3)

            col += 1
            if col > 3:
                col = 0
                row += 1

        # 清除按钮（红色）
        tk.Button(
            button_frame,
            text="C",
            command=self.clear_expression,
            bg="#FF0000",
            fg="#FFFFFF",
            font=("Arial", 14),
            relief=tk.RAISED,
            bd=3,
            padx=5,
            pady=5
        ).grid(row=row, column=0, columnspan=4, sticky="nsew", padx=3, pady=3)

        # 配置网格权重
        for i in range(4):
            button_frame.grid_columnconfigure(i, weight=1)
        for i in range(row + 1):
            button_frame.grid_rowconfigure(i, weight=1)

    def clear_frame(self):
        """清空当前显示的界面"""
        for widget in self.main_frame.winfo_children():
            widget.destroy()

    def on_button_click(self, char):
        """处理普通按钮点击事件"""
        if char == "=":
            # 计算表达式结果
            try:
                # 替换π和e为对应数值
                calc_expr = self.expression.replace(
                    "π", str(math.pi)).replace("e", str(math.e))
                result = eval(calc_expr)
                # 处理小数位数，避免过长
                if isinstance(result, float) and result.is_integer():
                    result = int(result)
                self.result_var.set(str(result))
                self.expression = str(result)  # 计算结果作为下一次输入的起始
            except Exception as e:
                self.result_var.set("错误")
                self.expression = ""
        else:
            # 清空错误状态
            if self.result_var.get() == "错误":
                self.clear_expression()
            # 拼接表达式
            if self.expression == "0" and char.isdigit():
                self.expression = char  # 替换初始的0
            else:
                self.expression += char
            self.result_var.set(self.expression)

    def on_scientific_click(self, char):
        """处理科学计算按钮点击事件"""
        try:
            current_val = float(self.result_var.get()
                                ) if self.result_var.get() != "0" else 0.0

            if char == "sin":
                result = math.sin(math.radians(current_val))  # 转角度为弧度
            elif char == "cos":
                result = math.cos(math.radians(current_val))
            elif char == "tan":
                result = math.tan(math.radians(current_val))
            elif char == "√":
                result = math.sqrt(current_val) if current_val >= 0 else "错误"
            elif char == "^2":
                result = current_val ** 2

            if result == "错误":
                self.result_var.set("错误")
                self.expression = ""
            else:
                self.result_var.set(round(result, 6))  # 保留6位小数
                self.expression = str(result)
        except:
            self.result_var.set("错误")
            self.expression = ""

    def clear_expression(self):
        """清空表达式和显示框"""
        self.expression = ""
        self.result_var.set("0")


if __name__ == "__main__":
    # 创建主窗口
    root = tk.Tk()
    # 初始化计算器
    app = MultiStyleCalculator(root)
    # 启动主循环
    root.mainloop()
