import tkinter as tk
from tkinter import ttk, messagebox

class WeightConverter:
    # 所有单位统一转换为克（gram）的换算系数
    UNITS = {
        '克 (g)': 1,
        '千克 (kg)': 1000,
        '吨 (t)': 1000000,
        '磅 (lb)': 453.59237,
        '盎司 (oz)': 28.349523125,
        '斤 (jin)': 500,
    }

    def __init__(self, root):
        self.root = root
        self.root.title("重量单位转换器")
        self.root.geometry("400x300")
        self.root.resizable(False, False)
        
        # 设置主题样式
        style = ttk.Style()
        style.theme_use('clam')
        
        self.create_widgets()

    def create_widgets(self):
        # 标题
        title_label = tk.Label(
            self.root,
            text="🏋️ 重量单位转换器",
            font=("微软雅黑", 16, "bold"),
            fg="#2c3e50"
        )
        title_label.pack(pady=15)

        # 输入框框架
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10, padx=20, fill="x")

        tk.Label(input_frame, text="数值:", font=("微软雅黑", 10)).grid(row=0, column=0, sticky="w")
        self.value_entry = tk.Entry(input_frame, font=("微软雅黑", 10), width=20)
        self.value_entry.grid(row=0, column=1, padx=10, pady=5)
        self.value_entry.bind('<KeyRelease>', self.convert)

        tk.Label(input_frame, text="从:", font=("微软雅黑", 10)).grid(row=1, column=0, sticky="w")
        self.from_unit = ttk.Combobox(
            input_frame,
            values=list(self.UNITS.keys()),
            state="readonly",
            font=("微软雅黑", 10),
            width=18
        )
        self.from_unit.current(1)  # 默认千克
        self.from_unit.grid(row=1, column=1, padx=10, pady=5)
        self.from_unit.bind('<<ComboboxSelected>>', self.convert)

        tk.Label(input_frame, text="到:", font=("微软雅黑", 10)).grid(row=2, column=0, sticky="w")
        self.to_unit = ttk.Combobox(
            input_frame,
            values=list(self.UNITS.keys()),
            state="readonly",
            font=("微软雅黑", 10),
            width=18
        )
        self.to_unit.current(0)  # 默认克
        self.to_unit.grid(row=2, column=1, padx=10, pady=5)
        self.to_unit.bind('<<ComboboxSelected>>', self.convert)

        # 转换按钮
        self.convert_btn = tk.Button(
            self.root,
            text="🔄 转换",
            font=("微软雅黑", 10, "bold"),
            bg="#3498db",
            fg="white",
            width=20,
            command=self.convert
        )
        self.convert_btn.pack(pady=10)

        # 结果显示
        result_frame = tk.LabelFrame(self.root, text="转换结果", font=("微软雅黑", 10), padx=10, pady=10)
        result_frame.pack(pady=10, padx=20, fill="x")

        self.result_label = tk.Label(
            result_frame,
            text="请输入数值进行转换",
            font=("微软雅黑", 11),
            fg="#27ae60",
            wraplength=340,
            justify="center"
        )
        self.result_label.pack()

        # 快速转换按钮（常用转换）
        quick_frame = tk.LabelFrame(self.root, text="快捷转换", font=("微软雅黑", 10), padx=10, pady=10)
        quick_frame.pack(pady=10, padx=20, fill="x")

        quick_btns = [
            ("千克 → 磅", 1, '千克 (kg)', '磅 (lb)'),
            ("磅 → 千克", 1, '磅 (lb)', '千克 (kg)'),
            ("斤 → 克", 1, '斤 (jin)', '克 (g)'),
            ("克 → 盎司", 1, '克 (g)', '盎司 (oz)'),
        ]

        for i, (text, val, from_u, to_u) in enumerate(quick_btns):
            btn = tk.Button(
                quick_frame,
                text=text,
                font=("微软雅黑", 9),
                width=12,
                command=lambda v=val, f=from_u, t=to_u: self.quick_convert(v, f, t)
            )
            btn.grid(row=i // 2, column=i % 2, padx=5, pady=5)

    def convert(self, event=None):
        value_str = self.value_entry.get().strip()
        
        if not value_str:
            self.result_label.config(text="请输入数值进行转换", fg="#7f8c8d")
            return

        try:
            value = float(value_str)
            from_u = self.from_unit.get()
            to_u = self.to_unit.get()

            # 转换为克，再转换为目标单位
            value_in_grams = value * self.UNITS[from_u]
            result = value_in_grams / self.UNITS[to_u]

            # 格式化输出
            if abs(result) >= 1000 or (abs(result) < 0.001 and result != 0):
                result_str = f"{result:.6e}"
            else:
                result_str = f"{result:.6f}".rstrip('0').rstrip('.')

            display_text = f"{value} {from_u} =\n\n{result_str} {to_u}"
            self.result_label.config(text=display_text, fg="#27ae60")

        except ValueError:
            self.result_label.config(text="⚠️ 请输入有效的数字", fg="#e74c3c")

    def quick_convert(self, value, from_u, to_u):
        self.value_entry.delete(0, tk.END)
        self.value_entry.insert(0, str(value))
        self.from_unit.set(from_u)
        self.to_unit.set(to_u)
        self.convert()


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