# 导入Tkinter库（Python内置GUI库）
import tkinter as tk
from tkinter import font

# 定义计算器主类


class Calculator:
    def __init__(self, root):
        # 主窗口设置
        self.root = root
        self.root.title("简易计算器")
        self.root.geometry("320x420")  # 窗口大小
        self.root.resizable(False, False)  # 禁止缩放

        # 定义字体
        self.display_font = font.Font(size=24)
        self.btn_font = font.Font(size=16)

        # 存储输入的表达式
        self.expression = ""

        # 创建显示框
        self.display_var = tk.StringVar()
        self.display_var.set("0")
        display = tk.Entry(
            root, textvariable=self.display_var, font=self.display_font,
            bd=10, insertwidth=2, width=14, justify=tk.RIGHT
        )
        display.grid(row=0, column=0, columnspan=4, pady=10, padx=10)

        # ---------------------- 按钮布局 ----------------------
        # 第一行：清空、退格、%、÷
        self.create_btn("C", 1, 0, "#ff6b6b")
        self.create_btn("←", 1, 1, "#ff6b6b")
        self.create_btn("%", 1, 2)
        self.create_btn("/", 1, 3, "#feca57")

        # 第二行：7、8、9、×
        self.create_btn("7", 2, 0)
        self.create_btn("8", 2, 1)
        self.create_btn("9", 2, 2)
        self.create_btn("*", 2, 3, "#feca57")

        # 第三行：4、5、6、-
        self.create_btn("4", 3, 0)
        self.create_btn("5", 3, 1)
        self.create_btn("6", 3, 2)
        self.create_btn("-", 3, 3, "#feca57")

        # 第四行：1、2、3、+
        self.create_btn("1", 4, 0)
        self.create_btn("2", 4, 1)
        self.create_btn("3", 4, 2)
        self.create_btn("+", 4, 3, "#feca57")

        # 第五行：0、.、=
        self.create_btn("0", 5, 0)
        self.create_btn(".", 5, 1)
        self.create_btn("=", 5, 2, "#48dbfb")
        # 让等于按钮跨两列
        equal_btn = tk.Button(
            root, text="=", font=self.btn_font, padx=20, pady=10,
            bg="#48dbfb", command=self.calculate
        )
        equal_btn.grid(row=5, column=2, columnspan=2,
                       sticky="nsew", padx=5, pady=5)

    # 创建按钮的通用方法
    def create_btn(self, text, row, col, bg="#ffffff"):
        btn = tk.Button(
            self.root, text=text, font=self.btn_font, padx=20, pady=10,
            bg=bg, command=lambda t=text: self.on_btn_click(t)
        )
        btn.grid(row=row, column=col, sticky="nsew", padx=5, pady=5)

    # 按钮点击事件
    def on_btn_click(self, char):
        if char == "C":
            # 清空
            self.expression = ""
            self.display_var.set("0")
        elif char == "←":
            # 退格
            self.expression = self.expression[:-1]
            self.display_var.set(self.expression if self.expression else "0")
        else:
            # 拼接表达式
            self.expression += str(char)
            self.display_var.set(self.expression)

    # 计算结果
    def calculate(self):
        try:
            # 计算表达式结果
            result = eval(self.expression)
            # 整数显示为整数，小数显示为小数
            self.display_var.set(int(result) if isinstance(
                result, float) and result.is_integer() else result)
            self.expression = str(result)
        except:
            # 计算出错
            self.display_var.set("错误")
            self.expression = ""


# 运行程序
if __name__ == "__main__":
    main_root = tk.Tk()
    app = Calculator(main_root)
    main_root.mainloop()
