import tkinter as tk
from tkinter import messagebox

class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("Python 智能计算器")
        self.root.geometry("320x450")
        self.root.resizable(False, False)

        # 存储当前输入的字符串
        self.result_var = tk.StringVar(value="0")

        # 界面布局
        self.setup_ui()

    def setup_ui(self):
        # 显示区域
        display = tk.Entry(
            self.root, 
            textvariable=self.result_var, 
            font=("Arial", 24), 
            justify="right", 
            bd=10, 
            insertwidth=4, 
            bg="#eee", 
            readonlybackground="#eee",
            state="readonly"
        )
        display.pack(fill=tk.BOTH, padx=10, pady=20)

        # 按钮布局
        button_frame = tk.Frame(self.root)
        button_frame.pack(fill=tk.BOTH, expand=True)

        # 按钮标签定义
        buttons = [
            'C', '←', '%', '/',
            '7', '8', '9', '*',
            '4', '5', '6', '-',
            '1', '2', '3', '+',
            '0', '.', '=', 
        ]

        # 循环创建按钮
        row = 0
        col = 0
        for button in buttons:
            # 针对 '=' 按钮做特殊跨列处理
            cmd = lambda x=button: self.on_click(x)
            if button == '=':
                btn = tk.Button(button_frame, text=button, width=10, height=2, font=("Arial", 14), bg="#4CAF50", fg="white", command=cmd)
                btn.grid(row=row, column=col, columnspan=2, sticky="nsew")
                col += 1
            else:
                btn = tk.Button(button_frame, text=button, width=5, height=2, font=("Arial", 14), command=cmd)
                btn.grid(row=row, column=col, sticky="nsew")
            
            col += 1
            if col > 3:
                col = 0
                row += 1

        # 设置网格权重，使按钮随窗口拉伸
        for i in range(5):
            button_frame.grid_rowconfigure(i, weight=1)
        for i in range(4):
            button_frame.grid_columnconfigure(i, weight=1)

    def on_click(self, char):
        current_text = self.result_var.get()

        if char == 'C':
            # 清空
            self.result_var.set("0")
        
        elif char == '←':
            # 退格
            if len(current_text) > 1:
                self.result_var.set(current_text[:-1])
            else:
                self.result_var.set("0")

        elif char == '=':
            # 计算结果
            try:
                # eval 函数可以将字符串作为数学表达式执行
                # 将显示屏中的内容进行计算
                result = eval(current_text)
                # 处理浮点数精度问题，如 0.1+0.2
                if isinstance(result, float):
                    result = round(result, 8)
                self.result_var.set(str(result))
            except ZeroDivisionError:
                messagebox.showerror("错误", "除数不能为零")
                self.result_var.set("0")
            except Exception:
                messagebox.showerror("错误", "非法输入")
                self.result_var.set("0")

        else:
            # 输入数字或运算符
            if current_text == "0" and char not in "./*+-":
                self.result_var.set(char)
            else:
                self.result_var.set(current_text + char)

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