import tkinter as tk

# =======================
# 温度转换函数
# =======================
def c_to_f(c):
    return c * 9 / 5 + 32

def c_to_k(c):
    return c + 273.15

def f_to_c(f):
    return (f - 32) * 5 / 9

def f_to_k(f):
    return (f - 32) * 5 / 9 + 273.15

def k_to_c(k):
    return k - 273.15

def k_to_f(k):
    return (k - 273.15) * 9 / 5 + 32


# =======================
# 主题配置
# =======================
THEMES = {
    "冰川蓝": {
        "bg": "#eef3fb", "card": "#ffffff", "border": "#d0d8e8",
        "primary": "#3a8fd6", "hover": "#5aa8ee",
        "text": "#1a2a3a", "sub": "#6a7a8a",
        "input_bg": "#f4f7fc", "icon": "❄️"
    },
    "日落橙": {
        "bg": "#fdf6ee", "card": "#ffffff", "border": "#e8d8c8",
        "primary": "#e67e22", "hover": "#f09030",
        "text": "#2a1a0a", "sub": "#8a7a6a",
        "input_bg": "#fdf4ec", "icon": "🔥"
    },
    "薄荷绿": {
        "bg": "#eefbf3", "card": "#ffffff", "border": "#c8e8d0",
        "primary": "#27ae60", "hover": "#2ecc71",
        "text": "#1a2a1a", "sub": "#6a8a6a",
        "input_bg": "#f0faf4", "icon": "🌿"
    },
    "暗夜紫": {
        "bg": "#1a1525", "card": "#251f35", "border": "#3a3055",
        "primary": "#8b5cf6", "hover": "#a78bfa",
        "text": "#eee8ff", "sub": "#9988bb",
        "input_bg": "#2d2545", "icon": "🌙"
    },
}


class TemperatureConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("温度转换器")
        self.root.geometry("420x780")
        self.root.resizable(False, False)

        self.current_theme = "冰川蓝"
        self.theme = THEMES[self.current_theme]

        self.input_unit = tk.StringVar(value="摄氏度 ℃")
        self.output_unit = tk.StringVar(value="华氏度 ℉")
        self.input_var = tk.StringVar(value="25")
        self.result_var = tk.StringVar(value="")

        self.build_ui()
        self.calculate()

    # =======================
    # 界面构建
    # =======================
    def build_ui(self):
        t = self.theme

        # ===== 顶部 =====
        top = tk.Frame(self.root, bg=t["bg"])
        top.pack(fill="x")

        tk.Label(
            top, text=t["icon"],
            font=("Segoe UI Emoji", 42),
            bg=t["bg"]
        ).pack(pady=(20, 5))

        tk.Label(
            top, text="温度转换器",
            font=("PingFang SC", 22, "bold"),
            bg=t["bg"], fg=t["text"]
        ).pack()

        tk.Label(
            top, text="摄氏度 / 华氏度 / 开尔文",
            font=("PingFang SC", 10),
            bg=t["bg"], fg=t["sub"]
        ).pack(pady=(2, 10))

        # ===== 主题切换 =====
        theme_bar = tk.Frame(top, bg=t["bg"])
        theme_bar.pack()

        for name, info in THEMES.items():
            tk.Button(
                theme_bar,
                text=info["icon"],
                font=("Segoe UI Emoji", 16),
                bg=t["card"] if name != self.current_theme else t["primary"],
                fg=t["sub"] if name != self.current_theme else "#ffffff",
                activebackground=t["hover"],
                activeforeground="#ffffff",
                relief="flat",
                cursor="hand2",
                command=lambda n=name: self.switch_theme(n)
            ).pack(side="left", padx=6)

        # ===== 输入卡片 =====
        card_in = tk.Frame(
            self.root, bg=t["card"],
            highlightbackground=t["border"], highlightthickness=1,
            padx=22, pady=18
        )
        card_in.pack(fill="x", padx=20, pady=(15, 8))

        tk.Label(
            card_in, text="输入温度",
            font=("PingFang SC", 11),
            bg=t["card"], fg=t["sub"], anchor="w"
        ).pack(fill="x")

        row = tk.Frame(card_in, bg=t["card"])
        row.pack(fill="x", pady=(8, 10))

        self.entry = tk.Entry(
            row, textvariable=self.input_var,
            font=("PingFang SC", 28, "bold"),
            bg=t["input_bg"], fg=t["primary"],
            justify="right", relief="flat",
            insertbackground=t["primary"], width=10
        )
        self.entry.pack(side="right", fill="x", expand=True)
        self.entry.bind("<KeyRelease>", self.calculate)

        self.from_btn = self._unit_menu(card_in, self.input_unit)
        self.from_btn.pack(fill="x")

        # ===== 交换 =====
        swap = tk.Frame(self.root, bg=t["bg"])
        swap.pack(fill="x", padx=20)

        tk.Button(
            swap, text="⇅ 交换单位",
            font=("PingFang SC", 12, "bold"),
            bg=t["primary"], fg="#ffffff",
            activebackground=t["hover"],
            relief="flat", cursor="hand2",
            command=self.swap_units
        ).pack(pady=8)

        # ===== 输出卡片 =====
        card_out = tk.Frame(
            self.root, bg=t["card"],
            highlightbackground=t["border"], highlightthickness=1,
            padx=22, pady=18
        )
        card_out.pack(fill="x", padx=20, pady=(0, 15))

        tk.Label(
            card_out, text="转换为",
            font=("PingFang SC", 11),
            bg=t["card"], fg=t["sub"], anchor="w"
        ).pack(fill="x")

        self.to_btn = self._unit_menu(card_out, self.output_unit)
        self.to_btn.pack(fill="x", pady=(5, 10))

        tk.Label(
            card_out, text="转换结果",
            font=("PingFang SC", 11),
            bg=t["card"], fg=t["sub"], anchor="w"
        ).pack(fill="x")

        tk.Label(
            card_out, textvariable=self.result_var,
            font=("PingFang SC", 28, "bold"),
            bg=t["card"], fg=t["primary"]
        ).pack(anchor="e", pady=(8, 0))

        # ===== 快捷温度 =====
        quick = tk.Frame(self.root, bg=t["bg"])
        quick.pack(fill="x", padx=20, pady=(5, 10))

        temps = [
            ("绝对零度", -273.15, "开尔文 K"),
            ("冰点", 0, "摄氏度 ℃"),
            ("室温", 25, "摄氏度 ℃"),
            ("体温", 36.5, "摄氏度 ℃"),
            ("沸点", 100, "摄氏度 ℃"),
        ]

        for name, val, unit in temps:
            tk.Button(
                quick, text=f"{name}\n{val}°",
                font=("PingFang SC", 9),
                bg=t["card"], fg=t["text"],
                activebackground=t["primary"],
                activeforeground="#ffffff",
                relief="flat", cursor="hand2",
                command=lambda v=val, u=unit: self.set_temp(v, u)
            ).pack(side="left", padx=3)

    # =======================
    # 工具方法
    # =======================
    def _unit_menu(self, parent, var):
        t = self.theme
        menu = tk.Menubutton(
            parent, textvariable=var,
            font=("PingFang SC", 13),
            bg=t["input_bg"], fg=t["text"],
            activebackground=t["primary"],
            activeforeground="#ffffff",
            relief="flat", padx=12, pady=6,
            anchor="w"
        )
        m = tk.Menu(menu, tearoff=0,
                    bg=t["input_bg"], fg=t["text"],
                    activebackground=t["primary"],
                    activeforeground="#ffffff")
        for u in ["摄氏度 ℃", "华氏度 ℉", "开尔文 K"]:
            m.add_radiobutton(label=u, variable=var, value=u,
                              command=self.calculate)
        menu["menu"] = m
        return menu

    def switch_theme(self, name):
        self.current_theme = name
        self.theme = THEMES[name]
        self.refresh_ui()

    def refresh_ui(self):
        t = self.theme
        self.root.configure(bg=t["bg"])
        self.build_ui()

    def set_temp(self, val, unit):
        self.input_var.set(str(val))
        self.input_unit.set(unit)
        self.calculate()

    def swap_units(self):
        s = self.input_unit.get()
        d = self.output_unit.get()
        self.input_unit.set(d)
        self.output_unit.set(s)
        self.calculate()

    def calculate(self, event=None):
        try:
            v = float(self.input_var.get())
        except:
            self.result_var.set("")
            return

        src = self.input_unit.get()
        dst = self.output_unit.get()

        # 转成摄氏度
        if "摄氏" in src:
            c = v
        elif "华氏" in src:
            c = f_to_c(v)
        else:
            c = k_to_c(v)

        # 转成目标
        if "摄氏" in dst:
            r = c
        elif "华氏" in dst:
            r = c_to_f(c)
        else:
            r = c_to_k(c)

        self.result_var.set(f"{r:.2f}")

# =======================
# 启动
# =======================
if __name__ == "__main__":
    root = tk.Tk()
    TemperatureConverter(root)
    root.mainloop()