import tkinter as tk
from tkinter import ttk, messagebox

class WeightConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("重量单位转换器")
        self.root.geometry("500x400")
        self.root.resizable(False, False)
        
        # 转换率（以克为基准）
        self.conversion_rates = {
            '千克 (kg)': 1000,
            '克 (g)': 1,
            '毫克 (mg)': 0.001,
            '磅 (lb)': 453.592,
            '盎司 (oz)': 28.3495,
            '斤': 500,
            '两': 50
        }
        
        self.setup_ui()
    
    def setup_ui(self):
        # 标题
        title_label = tk.Label(
            self.root, 
            text="重量单位转换器", 
            font=("Arial", 20, "bold"),
            fg="#2c3e50"
        )
        title_label.pack(pady=20)
        
        # 主框架
        main_frame = tk.Frame(self.root)
        main_frame.pack(pady=10, padx=20, fill="both", expand=True)
        
        # 输入区域
        input_frame = tk.LabelFrame(main_frame, text="输入", font=("Arial", 12), padx=10, pady=10)
        input_frame.pack(fill="x", pady=5)
        
        tk.Label(input_frame, text="数值:", font=("Arial", 11)).grid(row=0, column=0, padx=5, pady=5, sticky="w")
        self.input_value = tk.Entry(input_frame, font=("Arial", 14), width=15)
        self.input_value.grid(row=0, column=1, padx=5, pady=5)
        self.input_value.bind('<KeyRelease>', self.convert)  # 实时转换
        
        tk.Label(input_frame, text="从:", font=("Arial", 11)).grid(row=1, column=0, padx=5, pady=5, sticky="w")
        self.from_unit = ttk.Combobox(
            input_frame, 
            values=list(self.conversion_rates.keys()), 
            font=("Arial", 11),
            width=12,
            state="readonly"
        )
        self.from_unit.grid(row=1, column=1, padx=5, pady=5)
        self.from_unit.set("千克 (kg)")
        self.from_unit.bind('<<ComboboxSelected>>', self.convert)
        
        # 交换按钮
        swap_btn = tk.Button(
            input_frame,
            text="⇄",
            font=("Arial", 16),
            width=4,
            command=self.swap_units
        )
        swap_btn.grid(row=0, column=2, rowspan=2, padx=20)
        
        tk.Label(input_frame, text="到:", font=("Arial", 11)).grid(row=2, column=0, padx=5, pady=5, sticky="w")
        self.to_unit = ttk.Combobox(
            input_frame,
            values=list(self.conversion_rates.keys()),
            font=("Arial", 11),
            width=12,
            state="readonly"
        )
        self.to_unit.grid(row=2, column=1, padx=5, pady=5)
        self.to_unit.set("克 (g)")
        self.to_unit.bind('<<ComboboxSelected>>', self.convert)
        
        # 输出区域
        output_frame = tk.LabelFrame(main_frame, text="转换结果", font=("Arial", 12), padx=10, pady=10)
        output_frame.pack(fill="both", expand=True, pady=10)
        
        self.result_label = tk.Label(
            output_frame,
            text="请输入数值",
            font=("Arial", 24, "bold"),
            fg="#27ae60",
            wraplength=400
        )
        self.result_label.pack(expand=True)
        
        # 详细信息
        self.detail_label = tk.Label(
            output_frame,
            text="",
            font=("Arial", 11),
            fg="#7f8c8d"
        )
        self.detail_label.pack(pady=5)
        
        # 底部按钮
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=10)
        
        clear_btn = tk.Button(
            button_frame,
            text="清空",
            font=("Arial", 11),
            width=10,
            command=self.clear_all
        )
        clear_btn.pack(side="left", padx=10)
        
        exit_btn = tk.Button(
            button_frame,
            text="退出",
            font=("Arial", 11),
            width=10,
            command=self.root.quit
        )
        exit_btn.pack(side="left", padx=10)
    
    def convert(self, event=None):
        """执行单位转换"""
        try:
            # 获取输入值
            value_str = self.input_value.get().strip()
            if not value_str:
                self.result_label.config(text="请输入数值", fg="#7f8c8d")
                self.detail_label.config(text="")
                return
            
            value = float(value_str)
            
            # 获取单位
            from_unit = self.from_unit.get()
            to_unit = self.to_unit.get()
            
            if not from_unit or not to_unit:
                return
            
            # 转换为克
            grams = value * self.conversion_rates[from_unit]
            
            # 从克转换为目标单位
            result = grams / self.conversion_rates[to_unit]
            
            # 显示结果
            formatted_result = f"{result:.10f}".rstrip('0').rstrip('.')
            if '.' not in formatted_result:
                formatted_result += '.0'
            
            self.result_label.config(
                text=f"{formatted_result} {to_unit}",
                fg="#27ae60"
            )
            
            # 显示详细信息
            self.detail_label.config(
                text=f"{value} {from_unit} = {grams:.6f} 克"
            )
            
        except ValueError:
            self.result_label.config(text="请输入有效数字", fg="#e74c3c")
            self.detail_label.config(text="")
        except Exception as e:
            self.result_label.config(text="转换出错", fg="#e74c3c")
            self.detail_label.config(text=str(e))
    
    def swap_units(self):
        """交换单位"""
        from_unit = self.from_unit.get()
        to_unit = self.to_unit.get()
        self.from_unit.set(to_unit)
        self.to_unit.set(from_unit)
        self.convert()
    
    def clear_all(self):
        """清空所有输入"""
        self.input_value.delete(0, tk.END)
        self.from_unit.set("千克 (kg)")
        self.to_unit.set("克 (g)")
        self.result_label.config(text="请输入数值", fg="#7f8c8d")
        self.detail_label.config(text="")

def main():
    root = tk.Tk()
    app = WeightConverter(root)
    root.mainloop()

if __name__ == "__main__":
    main()