import tkinter as tk
from tkinter import messagebox


class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("计算器")
        self.root.resizable(False, False)

        self.expression = ""

        # 显示区域
        self.display_var = tk.StringVar(value="0")
        display = tk.Entry(
            root,
            textvariable=self.display_var,
            font=("Arial", 20),
            bd=10,
            relief="ridge",
            justify="right",
            state="readonly",
        )
        display.grid(row=0, column=0, columnspan=4, ipady=10, sticky="nsew")

        # 按钮布局
        buttons = [
            ["C", "⌫", "%", "/"],
            ["7", "8", "9", "*"],
            ["4", "5", "6", "-"],
            ["1", "2", "3", "+"],
            ["0", ".", "=", ""],
        ]

        for i, row in enumerate(buttons):
            for j, text in enumerate(row):
                if text == "":
                    continue
                btn = tk.Button(
                    root,
                    text=text,
                    font=("Arial", 16),
                    width=5,
                    height=2,
                    command=lambda t=text: self.on_click(t),
                )
                btn.grid(row=i + 1, column=j, padx=2, pady=2, sticky="nsew")

        for col in range(4):
            root.grid_columnconfigure(col, weight=1)
        for row in range(6):
            root.grid_rowconfigure(row, weight=1)

    def on_click(self, value):
        if value == "C":
            self.expression = ""
            self.display_var.set("0")

        elif value == "⌫":
            self.expression = self.expression[:-1]
            self.display_var.set(self.expression if self.expression else "0")

        elif value == "=":
            try:
                result = eval(self.expression)
                self.expression = str(result)
                self.display_var.set(self.expression)
            except Exception:
                messagebox.showerror("错误", "表达式无效")
                self.expression = ""
                self.display_var.set("0")

        elif value == "%":
            try:
                self.expression = str(eval(self.expression) / 100)
                self.display_var.set(self.expression)
            except Exception:
                messagebox.showerror("错误", "无法计算百分比")

        else:
            self.expression += value
            self.display_var.set(self.expression)


if __name__ == "__main__":
    root = tk.Tk()
    app = Calculator(root)
    root.mainloop()