import tkinter as tk
from tkinter import ttk, messagebox

class TempConverter:
    # 转换公式字典，方便扩展和维护
    FORMULAS = {
        ("C", "F"): lambda c: c * 9/5 + 32,
        ("F", "C"): lambda f: (f - 32) * 5/9,
        ("C", "K"): lambda c: c + 273.15,
        ("K", "C"): lambda k: k - 273.15,
        ("F", "K"): lambda f: (f - 32) * 5/9 + 273.15,
        ("K", "F"): lambda k: (k - 273.15) * 9/5 + 32,
    }

    def __init__(self, root):
        self.root = root
        self.root.title("温度单位转换器")
        self.root.geometry("400x220")
        self.root.resizable(False, False)
        
        # 设置整体样式
        style = ttk.Style()
        style.configure("TLabel", font=("Microsoft YaHei", 12))
        style.configure("TButton", font=("Microsoft YaHei", 11), padding=5)
        style.configure("TEntry", font=("Microsoft YaHei", 12))
        style.configure("TCombobox", font=("Microsoft YaHei", 11))

        # 输入区域
        input_frame = ttk.Frame(root, padding=15)
        input_frame.pack(fill="x")

        ttk.Label(input_frame, text="输入温度:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.entry_temp = ttk.Entry(input_frame, width=15)
        self.entry_temp.grid(row=0, column=1, padx=5, pady=5)
        self.entry_temp.insert(0, "0") # 默认值
        self.entry_temp.select_range(0, tk.END) # 默认全选，方便直接输入

        ttk.Label(input_frame, text="从:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.combo_from = ttk.Combobox(input_frame, values=["摄氏度 (°C)", "华氏度 (°F)", "开尔文 (K)"], state="readonly", width=14)
        self.combo_from.current(0)
        self.combo_from.grid(row=1, column=1, padx=5, pady=5, sticky="w")

        ttk.Label(input_frame, text="转换为:").grid(row=2, column=0, padx=5, pady=5, sticky="w")
        self.combo_to = ttk.Combobox(input_frame, values=["华氏度 (°F)", "摄氏度 (°C)", "开尔文 (K)"], state="readonly", width=14)
        self.combo_to.current(0)
        self.combo_to.grid(row=2, column=1, padx=5, pady=5, sticky="w")

        # 转换按钮（已将Emoji替换为纯文本，避免Tcl报错）
        btn_frame = ttk.Frame(root)
        btn_frame.pack(pady=10)
        ttk.Button(btn_frame, text="开始转换", command=self.convert).pack(side="left", padx=10)
        ttk.Button(btn_frame, text="互换单位", command=self.swap_units).pack(side="left", padx=10)

        # 结果显示
        self.result_var = tk.StringVar(value="等待转换...")
        result_label = ttk.Label(root, textvariable=self.result_var, font=("Microsoft YaHei", 14, "bold"), foreground="#2c3e50")
        result_label.pack(pady=15)

        # 绑定回车键触发转换
        self.root.bind("<Return>", lambda event: self.convert())

    def get_unit_code(self, unit_str):
        """从下拉框文本中提取单位代码 (C, F, K)"""
        if "C" in unit_str: return "C"
        if "F" in unit_str: return "F"
        if "K" in unit_str: return "K"
        return None

    def swap_units(self):
        """互换起始单位和目标单位"""
        from_val = self.combo_from.get()
        to_val = self.combo_to.get()
        self.combo_from.set(to_val)
        self.combo_to.set(from_val)

    def convert(self):
        try:
            temp = float(self.entry_temp.get())
            from_unit = self.get_unit_code(self.combo_from.get())
            to_unit = self.get_unit_code(self.combo_to.get())

            if from_unit == to_unit:
                self.result_var.set(f"{temp} = {temp} (单位相同)")
                return

            formula = self.FORMULAS.get((from_unit, to_unit))
            if formula:
                result = formula(temp)
                # 保留两位小数，去除不必要的尾零
                result_str = f"{result:.2f}".rstrip('0').rstrip('.')
                self.result_var.set(f"{temp} {from_unit} = {result_str} {to_unit}")
            else:
                self.result_var.set("转换失败：未知单位")

        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字！")
        except Exception as e:
            messagebox.showerror("未知错误", str(e))

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