import tkinter as tk
from tkinter import ttk, messagebox


class TemperatureConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("温度单位转换器")
        self.root.geometry("500x350")
        self.root.resizable(False, False)

        # 温度转换公式
        self.conversion_functions = {
            ("Celsius", "Fahrenheit"): lambda c: c * 9/5 + 32,
            ("Celsius", "Kelvin"): lambda c: c + 273.15,
            ("Fahrenheit", "Celsius"): lambda f: (f - 32) * 5/9,
            ("Fahrenheit", "Kelvin"): lambda f: (f - 32) * 5/9 + 273.15,
            ("Kelvin", "Celsius"): lambda k: k - 273.15,
            ("Kelvin", "Fahrenheit"): lambda k: (k - 273.15) * 9/5 + 32,
        }

        self.create_widgets()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(self.root, text="温度单位转换器",
                               font=("Arial", 18, "bold"))
        title_label.pack(pady=10)

        # 输入区域
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10)

        tk.Label(input_frame, text="输入温度:", font=(
            "Arial", 12)).grid(row=0, column=0, padx=5)
        self.input_entry = tk.Entry(input_frame, font=("Arial", 12), width=15)
        self.input_entry.grid(row=0, column=1, padx=5)
        self.input_entry.bind('<KeyRelease>', self.on_input_change)

        # 输入单位选择
        tk.Label(input_frame, text="从:", font=("Arial", 12)).grid(
            row=1, column=0, padx=5, pady=5)
        self.from_unit = ttk.Combobox(input_frame, values=["Celsius", "Fahrenheit", "Kelvin"],
                                      font=("Arial", 12), width=12, state="readonly")
        self.from_unit.set("Celsius")
        self.from_unit.grid(row=1, column=1, padx=5, pady=5)
        self.from_unit.bind('<<ComboboxSelected>>', self.on_unit_change)

        # 输出单位选择
        tk.Label(input_frame, text="到:", font=("Arial", 12)).grid(
            row=2, column=0, padx=5, pady=5)
        self.to_unit = ttk.Combobox(input_frame, values=["Celsius", "Fahrenheit", "Kelvin"],
                                    font=("Arial", 12), width=12, state="readonly")
        self.to_unit.set("Fahrenheit")
        self.to_unit.grid(row=2, column=1, padx=5, pady=5)
        self.to_unit.bind('<<ComboboxSelected>>', self.on_unit_change)

        # 转换按钮
        convert_btn = tk.Button(self.root, text="转换", font=("Arial", 14),
                                bg="#4CAF50", fg="white", command=self.convert)
        convert_btn.pack(pady=15)

        # 结果显示区域
        result_frame = tk.Frame(self.root)
        result_frame.pack(pady=10)

        tk.Label(result_frame, text="转换结果:", font=(
            "Arial", 12, "bold")).grid(row=0, column=0, padx=5)
        self.result_label = tk.Label(
            result_frame, text="", font=("Arial", 16, "bold"), fg="blue")
        self.result_label.grid(row=0, column=1, padx=5)

        # 清除按钮
        clear_btn = tk.Button(self.root, text="清除", font=("Arial", 12),
                              bg="#f44336", fg="white", command=self.clear)
        clear_btn.pack(pady=5)

        # 温度参考信息
        info_frame = tk.Frame(self.root, relief=tk.GROOVE, bd=2)
        info_frame.pack(pady=10, padx=20, fill=tk.X)

        info_text = """
        温度参考：
        水的冰点：0°C = 32°F = 273.15K
        水的沸点：100°C = 212°F = 373.15K
        绝对零度：-273.15°C = -459.67°F = 0K
        """
        info_label = tk.Label(info_frame, text=info_text,
                              font=("Arial", 9), justify=tk.LEFT)
        info_label.pack(pady=5)

    def convert(self):
        try:
            # 获取输入值
            input_value = float(self.input_entry.get())
            from_unit = self.from_unit.get()
            to_unit = self.to_unit.get()

            # 如果单位相同，直接显示原值
            if from_unit == to_unit:
                result = input_value
                result_text = f"{result:.4f} {to_unit}"
            else:
                # 获取转换函数并计算
                conversion_key = (from_unit, to_unit)
                if conversion_key in self.conversion_functions:
                    result = self.conversion_functions[conversion_key](
                        input_value)
                    result_text = f"{result:.4f} {to_unit}"
                else:
                    result_text = "转换公式不存在"

            self.result_label.config(text=result_text)

        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字！")

    def clear(self):
        """清除所有输入和结果"""
        self.input_entry.delete(0, tk.END)
        self.result_label.config(text="")
        self.from_unit.set("Celsius")
        self.to_unit.set("Fahrenheit")

    def on_input_change(self, event):
        """当输入框内容改变时自动转换（可选功能）"""
        if self.input_entry.get():
            self.convert()

    def on_unit_change(self, event):
        """当单位选择改变时自动转换（可选功能）"""
        if self.input_entry.get():
            self.convert()


def main():
    root = tk.Tk()
    app = TemperatureConverter(root)
    root.mainloop()


if __name__ == "__main__":
    main()
