import tkinter as tk
from tkinter import messagebox

class Calculator:
    def __init__(self, master):
        self.master = master
        master.title("Python 计算器")
        master.geometry("300x400") # 设置窗口大小
        master.resizable(0, 0) # 禁止调整窗口大小
        master.configure(bg="#2c3e50") # 设置背景颜色

        self.expression = ""
        self.input_text = tk.StringVar()

        # 显示屏
        self.input_field = tk.Entry(master, textvariable=self.input_text,
                                    font=('arial', 20, 'bold'), bd=10, insertwidth=4,
                                    width=14, borderwidth=4, justify='right',
                                    bg="#ecf0f1", fg="#2c3e50")
        self.input_field.grid(row=0, column=0, columnspan=4, padx=10, pady=10, ipady=10)
        self.input_field.focus() # 启动时自动聚焦

        # 按钮布局
        buttons = [
            ('C', 1, 0, '#e74c3c'), ('DEL', 1, 1, '#f39c12'), ('%', 1, 2, '#3498db'), ('/', 1, 3, '#3498db'),
            ('7', 2, 0, '#95a5a6'), ('8', 2, 1, '#95a5a6'), ('9', 2, 2, '#95a5a6'), ('*', 2, 3, '#3498db'),
            ('4', 3, 0, '#95a5a6'), ('5', 3, 1, '#95a5a6'), ('6', 3, 2, '#95a5a6'), ('-', 3, 3, '#3498db'),
            ('1', 4, 0, '#95a5a6'), ('2', 4, 1, '#95a5a6'), ('3', 4, 2, '#95a5a6'), ('+', 4, 3, '#3498db'),
            ('0', 5, 0, '#95a5a6'), ('.', 5, 1, '#95a5a6'), ('=', 5, 2, '#27ae60') # = 跨两列
        ]

        # 创建并放置按钮
        for (text, row, col, color) in buttons:
            if text == '=':
                button = tk.Button(master, text=text, fg='white', bg=color,
                                   command=self.calculate_result, height=2, width=10,
                                   font=('arial', 12, 'bold'))
                button.grid(row=row, column=col, columnspan=2, padx=5, pady=5, sticky="nsew")
            else:
                button = tk.Button(master, text=text, fg='white', bg=color,
                                   command=lambda char=text: self.button_click(char), height=2, width=5,
                                   font=('arial', 12, 'bold'))
                button.grid(row=row, column=col, padx=5, pady=5, sticky="nsew")

        # 配置列和行的权重，使按钮能够填充空间
        for i in range(6): # 6 rows (0-5)
            master.grid_rowconfigure(i, weight=1)
        for i in range(4): # 4 columns (0-3)
            master.grid_columnconfigure(i, weight=1)

        # 绑定键盘事件
        master.bind('<Key>', self.key_press)

    def button_click(self, char):
        if char == 'C':
            self.clear_display()
        elif char == 'DEL':
            self.delete_last_char()
        elif char == '=':
            self.calculate_result()
        else:
            self.expression += str(char)
            self.input_text.set(self.expression)

    def clear_display(self):
        self.expression = ""
        self.input_text.set("")

    def delete_last_char(self):
        self.expression = self.expression[:-1]
        self.input_text.set(self.expression)

    def calculate_result(self):
        try:
            result = str(eval(self.expression))
            self.input_text.set(result)
            self.expression = result # 将结果作为新的表达式，方便进行连续计算
        except SyntaxError:
            messagebox.showerror("错误", "无效的表达式！")
            self.expression = ""
            self.input_text.set("")
        except ZeroDivisionError:
            messagebox.showerror("错误", "除数不能为零！")
            self.expression = ""
            self.input_text.set("")
        except Exception as e:
            messagebox.showerror("错误", f"发生未知错误: {e}")
            self.expression = ""
            self.input_text.set("")

    def key_press(self, event):
        key = event.char
        if key.isdigit() or key in ['+', '-', '*', '/', '.', '%']:
            self.button_click(key)
        elif key == '\r': # Enter键
            self.calculate_result()
        elif key == '\x08': # Backspace键
            self.delete_last_char()
        elif key.lower() == 'c': # C键 (清除)
            self.clear_display()
        elif key == '=': # 等号键
            self.calculate_result()


# 创建主窗口
root = tk.Tk()
my_calculator = Calculator(root)
root.mainloop()