import tkinter as tk
from tkinter import font

class Calculator:
    def __init__(self, root):
        self.root = root
        self.root.title("计算器")
        self.root.geometry("350x500")
        self.root.resizable(False, False)
        
        # 设置字体
        self.display_font = font.Font(family="Arial", size=24, weight="bold")
        self.button_font = font.Font(family="Arial", size=16)
        
        # 存储当前输入
        self.current_input = "0"
        self.total_expression = ""
        self.operation = None
        self.overwrite = True
        
        # 创建显示区域
        self.create_display()
        
        # 创建按钮
        self.create_buttons()
        
        # 绑定键盘事件
        self.root.bind("<Key>", self.key_press)
        
    def create_display(self):
        # 创建显示框框架
        display_frame = tk.Frame(self.root, height=100, bg="#f0f0f0")
        display_frame.pack(expand=True, fill="both", padx=10, pady=(10, 5))
        
        # 总表达式显示
        self.total_label = tk.Label(
            display_frame,
            text=self.total_expression,
            anchor=tk.E,
            bg="#f0f0f0",
            fg="#666",
            font=self.button_font
        )
        self.total_label.pack(expand=True, fill="both", padx=10, pady=(5, 0))
        
        # 当前输入显示
        self.current_label = tk.Label(
            display_frame,
            text=self.current_input,
            anchor=tk.E,
            bg="#f0f0f0",
            fg="#000",
            font=self.display_font
        )
        self.current_label.pack(expand=True, fill="both", padx=10, pady=(0, 5))
    
    def create_buttons(self):
        # 创建按钮框架
        buttons_frame = tk.Frame(self.root)
        buttons_frame.pack(expand=True, fill="both", padx=10, pady=5)
        
        # 按钮布局
        buttons = [
            ("C", 1, 0, 2, "special", self.clear),
            ("⌫", 1, 2, 2, "special", self.backspace),
            ("÷", 1, 3, 2, "operator", lambda: self.operator_click("/")),
            
            ("7", 2, 0, 1, "number", lambda: self.number_click(7)),
            ("8", 2, 1, 1, "number", lambda: self.number_click(8)),
            ("9", 2, 2, 1, "number", lambda: self.number_click(9)),
            ("×", 2, 3, 2, "operator", lambda: self.operator_click("*")),
            
            ("4", 3, 0, 1, "number", lambda: self.number_click(4)),
            ("5", 3, 1, 1, "number", lambda: self.number_click(5)),
            ("6", 3, 2, 1, "number", lambda: self.number_click(6)),
            ("-", 3, 3, 2, "operator", lambda: self.operator_click("-")),
            
            ("1", 4, 0, 1, "number", lambda: self.number_click(1)),
            ("2", 4, 1, 1, "number", lambda: self.number_click(2)),
            ("3", 4, 2, 1, "number", lambda: self.number_click(3)),
            ("+", 4, 3, 2, "operator", lambda: self.operator_click("+")),
            
            ("0", 5, 0, 1, "number", lambda: self.number_click(0)),
            (".", 5, 1, 1, "number", lambda: self.decimal_click()),
            ("=", 5, 2, 2, "equals", self.equals_click)
        ]
        
        # 按钮颜色配置
        colors = {
            "number": {"bg": "#f0f0f0", "fg": "#000", "active_bg": "#e0e0e0"},
            "operator": {"bg": "#4a90e2", "fg": "#fff", "active_bg": "#3a80d2"},
            "special": {"bg": "#ff6b6b", "fg": "#fff", "active_bg": "#ff5b5b"},
            "equals": {"bg": "#4CAF50", "fg": "#fff", "active_bg": "#3d8b40"}
        }
        
        # 创建按钮
        for (text, row, col, colspan, btn_type, command) in buttons:
            btn_frame = tk.Frame(buttons_frame)
            btn_frame.grid(row=row, column=col, columnspan=colspan, 
                          sticky="nsew", padx=2, pady=2)
            btn_frame.grid_rowconfigure(0, weight=1)
            btn_frame.grid_columnconfigure(0, weight=1)
            
            btn = tk.Button(
                btn_frame,
                text=text,
                font=self.button_font,
                bg=colors[btn_type]["bg"],
                fg=colors[btn_type]["fg"],
                activebackground=colors[btn_type]["active_bg"],
                activeforeground=colors[btn_type]["fg"],
                relief="flat",
                borderwidth=0,
                cursor="hand2",
                command=command
            )
            btn.pack(expand=True, fill="both", ipady=10)
        
        # 配置网格权重
        for i in range(6):
            buttons_frame.grid_rowconfigure(i, weight=1)
        for i in range(4):
            buttons_frame.grid_columnconfigure(i, weight=1)
    
    def update_display(self):
        """更新显示内容"""
        self.current_label.config(text=self.current_input)
        self.total_label.config(text=self.total_expression)
    
    def number_click(self, num):
        """处理数字按钮点击"""
        if self.current_input == "0" or self.overwrite:
            self.current_input = str(num)
            self.overwrite = False
        else:
            self.current_input += str(num)
        self.update_display()
    
    def operator_click(self, op):
        """处理运算符点击"""
        if not self.overwrite:
            if self.total_expression and self.operation:
                # 如果有之前的运算，先计算
                self.calculate()
            
            self.total_expression = f"{self.current_input} {op}"
            self.operation = op
            self.overwrite = True
        else:
            # 更新运算符
            if self.total_expression:
                self.total_expression = f"{self.total_expression.split()[0]} {op}"
                self.operation = op
    
    def decimal_click(self):
        """处理小数点点击"""
        if self.overwrite:
            self.current_input = "0."
            self.overwrite = False
        elif "." not in self.current_input:
            self.current_input += "."
        self.update_display()
    
    def clear(self):
        """清除所有"""
        self.current_input = "0"
        self.total_expression = ""
        self.operation = None
        self.overwrite = True
        self.update_display()
    
    def backspace(self):
        """删除最后一位"""
        if len(self.current_input) > 1 and not self.overwrite:
            self.current_input = self.current_input[:-1]
        else:
            self.current_input = "0"
            self.overwrite = True
        self.update_display()
    
    def calculate(self):
        """执行计算"""
        try:
            num1 = float(self.total_expression.split()[0])
            num2 = float(self.current_input)
            
            if self.operation == "+":
                result = num1 + num2
            elif self.operation == "-":
                result = num1 - num2
            elif self.operation == "*":
                result = num1 * num2
            elif self.operation == "/":
                if num2 == 0:
                    raise ZeroDivisionError
                result = num1 / num2
            else:
                return
            
            # 处理浮点数精度问题
            if result.is_integer():
                result = int(result)
            
            self.current_input = str(result)
            self.total_expression = ""
            self.operation = None
            self.overwrite = True
            
        except ZeroDivisionError:
            self.current_input = "错误：除以零"
            self.total_expression = ""
            self.operation = None
            self.overwrite = True
        except:
            self.current_input = "错误"
            self.total_expression = ""
            self.operation = None
            self.overwrite = True
    
    def equals_click(self):
        """处理等号点击"""
        if self.operation and not self.overwrite:
            self.calculate()
            self.update_display()
    
    def key_press(self, event):
        """处理键盘输入"""
        key = event.char
        
        if key in "0123456789":
            self.number_click(int(key))
        elif key in "+-*/":
            operator_map = {"+": "+", "-": "-", "*": "×", "/": "÷"}
            self.operator_click(key)
        elif key == ".":
            self.decimal_click()
        elif key == "\r":  # Enter键
            self.equals_click()
        elif key == "\x08":  # Backspace键
            self.backspace()
        elif key == "c" or key == "C":
            self.clear()

def main():
    root = tk.Tk()
    calculator = Calculator(root)
    root.mainloop()

if __name__ == "__main__":
    main()