import tkinter as tk
from tkinter import ttk, messagebox

class WeightConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("⚖️ 重量单位转换器")
        self.root.geometry("500x420")
        
        # 单位定义 (以千克为基准)
        self.units = {
            # 公制单位
            'mg': ('毫克', 0.000001),
            'cg': ('厘克', 0.00001),
            'dg': ('分克', 0.0001),
            'g': ('克', 0.001),
            'kg': ('千克', 1),
            't': ('吨', 1000),
            
            # 英制单位
            'oz': ('盎司', 0.0283495),
            'lb': ('磅', 0.453592),
            'st': ('英石', 6.35029),
            'cwt': ('英担', 50.8023),
            'ton': ('英吨', 1016.05),
            
            # 中国市制单位
            'liang': ('两', 0.05),
            'jin': ('斤', 0.5),
            'dan': ('担', 50),
            
            # 珠宝单位
            'ct': ('克拉', 0.0002),
            'gr': ('格令', 0.0000648),
            
            # 科学单位
            'mcg': ('微克', 0.000000001),
            'ng': ('纳克', 0.000000000001)
        }
        
        # 创建界面
        self.create_widgets()
        
    def create_widgets(self):
        # 标题
        tk.Label(self.root, text="⚖️ 重量单位转换器", 
                font=("微软雅黑", 18, "bold"), fg="#2c3e50").pack(pady=15)
        
        # 输入框
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10)
        
        tk.Label(input_frame, text="数值:", font=("微软雅黑", 12)).pack(side=tk.LEFT, padx=5)
        self.entry_value = tk.Entry(input_frame, width=15, font=("Arial", 14))
        self.entry_value.pack(side=tk.LEFT, padx=5)
        self.entry_value.insert(0, "1")
        
        # 单位选择
        unit_frame = tk.Frame(self.root)
        unit_frame.pack(pady=15)
        
        # 从单位
        tk.Label(unit_frame, text="从:", font=("微软雅黑", 12)).grid(row=0, column=0, padx=5)
        self.from_unit = tk.StringVar(value='kg')
        from_combo = ttk.Combobox(unit_frame, textvariable=self.from_unit, 
                                 values=list(self.units.keys()), width=8, font=("Arial", 11))
        from_combo.grid(row=0, column=1, padx=5)
        
        # 交换按钮
        tk.Button(unit_frame, text="⇄", command=self.swap_units, 
                 font=("Arial", 14), width=3, bg="#3498db", fg="white").grid(row=0, column=2, padx=10)
        
        # 到单位
        tk.Label(unit_frame, text="到:", font=("微软雅黑", 12)).grid(row=0, column=3, padx=5)
        self.to_unit = tk.StringVar(value='g')
        to_combo = ttk.Combobox(unit_frame, textvariable=self.to_unit, 
                               values=list(self.units.keys()), width=8, font=("Arial", 11))
        to_combo.grid(row=0, column=4, padx=5)
        
        # 转换按钮
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)
        
        tk.Button(btn_frame, text="🔄 转换", command=self.convert, 
                 bg="#27ae60", fg="white", font=("微软雅黑", 12), width=12).pack(side=tk.LEFT, padx=5)
        tk.Button(btn_frame, text="清空", command=self.clear, 
                 bg="#e74c3c", fg="white", font=("微软雅黑", 12), width=8).pack(side=tk.LEFT, padx=5)
        
        # 结果显示
        result_frame = tk.Frame(self.root, relief=tk.SUNKEN, bd=2, bg="#ecf0f1")
        result_frame.pack(pady=15, padx=20, fill=tk.X)
        
        self.result_text = tk.StringVar(value="等待转换...")
        tk.Label(result_frame, textvariable=self.result_text, 
                font=("Arial", 14), fg="#2980b9", bg="#ecf0f1").pack(pady=15)
        
        # 快捷按钮
        quick_frame = tk.LabelFrame(self.root, text="快捷输入", font=("微软雅黑", 10))
        quick_frame.pack(pady=10, padx=20, fill=tk.X)
        
        quick_values = [
            ("1g", "0.001"), ("1kg", "1"), ("1t", "1000"),
            ("1两", "0.05"), ("1斤", "0.5"), ("1磅", "0.453592"),
            ("1oz", "0.02835"), ("1ct", "0.0002"), ("1mcg", "1e-9")
        ]
        
        for i, (text, value) in enumerate(quick_values):
            btn = tk.Button(quick_frame, text=text, width=6, height=1,
                          command=lambda v=value: self.set_value(v))
            btn.grid(row=i//3, column=i%3, padx=3, pady=3)
        
        # 绑定回车键
        self.root.bind('<Return>', lambda e: self.convert())
        
    def convert(self):
        try:
            # 获取输入
            value_str = self.entry_value.get().strip()
            if not value_str:
                return
                
            value = float(value_str)
            from_u = self.from_unit.get()
            to_u = self.to_unit.get()
            
            if from_u == to_u:
                result = value
            else:
                # 转换为千克
                kg = value * self.units[from_u][1]
                # 转换为目标单位
                result = kg / self.units[to_u][1]
            
            # 显示结果
            from_name = self.units[from_u][0]
            to_name = self.units[to_u][0]
            
            # 格式化输出
            if abs(result) >= 10000 or (abs(result) <= 0.0001 and result != 0):
                result_str = f"{result:.6e}"
            else:
                result_str = f"{result:.6f}".rstrip('0').rstrip('.')
                
            if abs(value) >= 10000 or (abs(value) <= 0.0001 and value != 0):
                value_str = f"{value:.6e}"
            else:
                value_str = f"{value:.6f}".rstrip('0').rstrip('.')
                
            self.result_text.set(f"{value_str} {from_name} = {result_str} {to_name}")
            
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字！")
        except Exception as e:
            messagebox.showerror("错误", f"转换失败：{str(e)}")
            
    def swap_units(self):
        # 交换单位
        from_val = self.from_unit.get()
        to_val = self.to_unit.get()
        self.from_unit.set(to_val)
        self.to_unit.set(from_val)
        self.convert()
        
    def set_value(self, value):
        # 设置数值
        self.entry_value.delete(0, tk.END)
        self.entry_value.insert(0, value)
        self.convert()
        
    def clear(self):
        # 清空
        self.entry_value.delete(0, tk.END)
        self.entry_value.insert(0, "")
        self.result_text.set("等待转换...")

# 运行程序
if __name__ == "__main__":
    root = tk.Tk()
    app = WeightConverter(root)
    root.mainloop()