import tkinter as tk

class Calculator:
    def __init__(self, root):
        # 主窗口配置
        self.root = root
        self.root.title("带历史记录计算器")
        self.root.geometry("580x420")
        self.root.resizable(False, False)

        # 存储当前输入、计算表达式
        self.current_text = tk.StringVar()
        self.history_list = []

        # 左侧计算器区域
        left_frame = tk.Frame(root, padx=10, pady=10)
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        # 右侧历史记录区域
        right_frame = tk.Frame(root, padx=10, pady=10)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH)

        # 输入显示框
        entry = tk.Entry(
            left_frame,
            textvariable=self.current_text,
            font=("Arial", 20),
            justify=tk.RIGHT,
            state="readonly"
        )
        entry.grid(row=0, column=0, columnspan=4, padx=5, pady=5, sticky="nsew")

        # 按钮布局
        btn_texts = [
            ("C", "←", "/", "*"),
            ("7", "8", "9", "-"),
            ("4", "5", "6", "+"),
            ("1", "2", "3", "+/-"),
            ("0", ".", "=", "")
        ]

        # 创建按钮（改用原生tk.Button，兼容所有环境）
        for row_idx, row_data in enumerate(btn_texts, 1):
            for col_idx, text in enumerate(row_data):
                if not text:
                    continue
                btn = tk.Button(
                    left_frame,
                    text=text,
                    font=("Arial", 14),
                    width=6,
                    height=2,
                    command=lambda t=text: self.on_click(t)
                )
                btn.grid(row=row_idx, column=col_idx, padx=3, pady=3, sticky="nsew")

        # 网格自适应
        for i in range(4):
            left_frame.columnconfigure(i, weight=1)
        for i in range(1, 6):
            left_frame.rowconfigure(i, weight=1)

        # 历史记录面板
        tk.Label(right_frame, text="📜 计算历史", font=("Arial", 14)).pack()
        scroll = tk.Scrollbar(right_frame)
        self.history_box = tk.Listbox(
            right_frame,
            width=22,
            height=18,
            font=("Arial", 11),
            yscrollcommand=scroll.set
        )
        scroll.config(command=self.history_box.yview)
        scroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.history_box.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

    # 按钮点击逻辑
    def on_click(self, text):
        current = self.current_text.get()

        if text == "C":
            self.current_text.set("")
        elif text == "←":
            self.current_text.set(current[:-1])
        elif text == "+/-":
            if current.startswith("-"):
                self.current_text.set(current[1:])
            else:
                self.current_text.set("-" + current)
        elif text == "=":
            if not current:
                return
            try:
                result = str(eval(current))
                if result.endswith(".0"):
                    result = result[:-2]
                record = f"{current} = {result}"
                self.history_list.append(record)
                self.history_box.insert(tk.END, record)
                self.history_box.yview(tk.END)
                self.current_text.set(result)
            except:
                self.current_text.set("表达式错误")
        else:
            self.current_text.set(current + text)

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