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_frame = tk.Frame(self.root, bg="#eee", height=100)
        display_frame.pack(expand=True, fill="both")

        display_label = tk.Label(
            display_frame, 
            textvariable=self.result_var, 
            anchor="e", 
            bg="#eee", 
            fg="#333", 
            font=("Arial", 30),
            padx=20
        )
        display_label.pack(expand=True, fill="both")

        # 按钮区域
        buttons_frame = tk.Frame(self.root)
        buttons_frame.pack(expand=True, fill="both")

        # 按钮定义 (标签, 行, 列, 跨列)
        buttons = [
            ('C', 0, 0), ('DEL', 0, 1), ('/', 0, 2), ('*', 0, 3),
            ('7', 1, 0), ('8', 1, 1), ('9', 1, 2), ('-', 1, 3),
            ('4', 2, 0), ('5', 2, 1), ('6', 2, 2), ('+', 2, 3),
            ('1', 3, 0), ('2', 3, 1), ('3', 3, 2), ('=', 3, 3, 2), # 等号跨两行
            ('0', 4, 0, 2), ('.', 4, 2) # 0 跨两列
        ]

        # 设置按钮样式
        btn_config = {
            "font": ("Arial", 14),
            "borderwidth": 1,
            "relief": "flat",
            "activebackground": "#bbb"
        }

        for btn_text, row, col, *span in buttons:
            colspan = span[0] if span else 1
            rowspan = 2 if btn_text == '=' else 1
            
            # 特殊颜色处理
            bg_color = "#f9f9f9"
            if btn_text in ['+', '-', '*', '/', '=']: bg_color = "#ff9500"
            if btn_text in ['C', 'DEL']: bg_color = "#d4d4d2"

            button = tk.Button(
                buttons_frame, text=btn_text, bg=bg_color,
                command=lambda t=btn_text: self.on_click(t),
                **btn_config
            )
            button.grid(row=row, column=col, columnspan=colspan, rowspan=rowspan, sticky="nsew", padx=1, pady=1)

        # 配置网格权重，使按钮自动填充
        for i in range(4):
            buttons_frame.grid_columnconfigure(i, weight=1)
        for i in range(5):
            buttons_frame.grid_rowconfigure(i, weight=1)

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

        if char == "C":
            self.result_var.set("0")
        elif char == "DEL":
            if len(current_text) > 1:
                self.result_var.set(current_text[:-1])
            else:
                self.result_var.set("0")
        elif char == "=":
            try:
                # 使用 eval 计算字符串结果
                # 将显示用的 * 和 / 替换回 Python 识别的符号（本例中已直接使用 Python 符号）
                result = eval(current_text)
                # 处理整数显示（去掉 .0）
                if result == int(result):
                    result = int(result)
                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":
                self.result_var.set(char)
            else:
                self.result_var.set(current_text + char)

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