import tkinter as tk
from tkinter import ttk


class Calculator:
    def __init__(self, root):
        # 初始化主窗口
        self.root = root
        self.root.title("计算器")
        self.root.geometry("400x500")
        self.root.resizable(False, False)  # 禁止窗口缩放

        # 存储计算的表达式和结果
        self.expression = ""
        self.result_var = tk.StringVar()
        self.result_var.set("0")

        # 创建界面组件
        self.create_widgets()

    def create_widgets(self):
        # 1. 显示框（结果展示区）
        display_frame = ttk.Frame(self.root, padding="10")
        display_frame.pack(fill=tk.BOTH, expand=True)

        display_entry = ttk.Entry(
            display_frame,
            textvariable=self.result_var,
            font=("Arial", 24),
            justify=tk.RIGHT,
            state="readonly"  # 只读，防止手动输入
        )
        display_entry.pack(fill=tk.BOTH, expand=True, ipady=15)

        # 2. 按钮区域
        button_frame = ttk.Frame(self.root, padding="10")
        button_frame.pack(fill=tk.BOTH, expand=True)

        # 按钮布局（按计算器常见布局排列）
        buttons = [
            ["C", "←", "%", "/"],
            ["7", "8", "9", "*"],
            ["4", "5", "6", "-"],
            ["1", "2", "3", "+"],
            ["0", ".", "=", ]
        ]

        # 设置按钮样式（统一大小、字体）
        style = ttk.Style()
        style.configure("Calc.TButton", font=("Arial", 16))

        # 循环创建按钮
        for row_idx, row_buttons in enumerate(buttons):
            # 每行创建一个子框架
            row_frame = ttk.Frame(button_frame)
            row_frame.pack(fill=tk.BOTH, expand=True)

            for col_idx, text in enumerate(row_buttons):
                # 特殊处理等号按钮（跨列）
                if text == "=":
                    button = ttk.Button(
                        row_frame,
                        text=text,
                        style="Calc.TButton",
                        command=lambda t=text: self.on_button_click(t)
                    )
                    button.pack(side=tk.LEFT, fill=tk.BOTH,
                                expand=True, padx=2, pady=2, ipadx=40)
                else:
                    button = ttk.Button(
                        row_frame,
                        text=text,
                        style="Calc.TButton",
                        command=lambda t=text: self.on_button_click(t)
                    )
                    button.pack(side=tk.LEFT, fill=tk.BOTH,
                                expand=True, padx=2, pady=2)

    def on_button_click(self, text):
        """处理按钮点击事件"""
        if text == "C":  # 清空
            self.expression = ""
            self.result_var.set("0")
        elif text == "←":  # 退格
            self.expression = self.expression[:-1]
            if not self.expression:
                self.result_var.set("0")
            else:
                self.result_var.set(self.expression)
        elif text == "=":  # 计算结果
            try:
                # 替换特殊运算符（% 转换为除以100）
                calc_expr = self.expression.replace("%", "/100")
                # 计算并保留6位小数（避免过多小数位）
                result = round(eval(calc_expr), 6)
                # 去掉末尾的0和小数点（如 5.0 → 5，5.200 → 5.2）
                if result.is_integer():
                    result = int(result)
                self.result_var.set(str(result))
                self.expression = str(result)  # 结果作为下一次计算的起始
            except:
                self.result_var.set("错误")
                self.expression = ""
        else:  # 数字/运算符/小数点
            # 避免开头直接输入运算符（除了负号）
            if (text in "+-*/" and not self.expression) and text != "-":
                return
            # 避免重复输入小数点（如 5..2 → 5.2）
            if text == "." and "." in self.expression.split()[-1]:
                return

            self.expression += text
            self.result_var.set(self.expression)


if __name__ == "__main__":
    # 创建主窗口并运行
    root = tk.Tk()
    app = Calculator(root)
    root.mainloop()
