import tkinter as tk
from tkinter import ttk, messagebox

# 定义单位转换系数（以千克为基准）
CONVERSION_FACTORS = {
    "千克(kg)": 1.0,
    "克(g)": 0.001,
    "斤": 0.5,          # 1斤 = 0.5千克
    "磅(lb)": 0.453592, # 1磅 ≈ 0.453592千克
    "盎司(oz)": 0.0283495 # 1盎司 ≈ 0.0283495千克
}

def convert_weight():
    """执行重量单位转换的核心函数"""
    try:
        # 获取输入数值
        input_value = float(entry_input.get())
        # 获取源单位和目标单位
        from_unit = combo_from.get()
        to_unit = combo_to.get()
        
        # 先转换为千克（基准单位），再转换为目标单位
        kg_value = input_value * CONVERSION_FACTORS[from_unit]
        result_value = kg_value / CONVERSION_FACTORS[to_unit]
        
        # 显示结果（保留6位小数，去除末尾多余的0）
        result_str = f"{result_value:.6f}".rstrip('0').rstrip('.') if '.' in f"{result_value:.6f}" else f"{result_value:.6f}"
        label_result.config(text=f"转换结果：{result_str} {to_unit}")
        
    except ValueError:
        # 处理非数字输入的异常
        messagebox.showerror("输入错误", "请输入有效的数字！")
        entry_input.delete(0, tk.END)  # 清空错误输入
    except Exception as e:
        # 处理其他意外错误
        messagebox.showerror("错误", f"转换失败：{str(e)}")

def swap_units():
    """交换源单位和目标单位"""
    current_from = combo_from.get()
    current_to = combo_to.get()
    combo_from.set(current_to)
    combo_to.set(current_from)

# 创建主窗口
root = tk.Tk()
root.title("重量单位转换器")
root.geometry("450x250")  # 设置窗口大小
root.resizable(False, False)  # 禁止调整窗口大小

# 创建样式（美化界面）
style = ttk.Style(root)
style.configure("TLabel", font=("微软雅黑", 10))
style.configure("TButton", font=("微软雅黑", 10))
style.configure("TCombobox", font=("微软雅黑", 10))

# 1. 输入数值区域
frame_input = ttk.Frame(root)
frame_input.pack(pady=20)

label_input = ttk.Label(frame_input, text="输入数值：")
label_input.grid(row=0, column=0, padx=5, pady=5)

entry_input = ttk.Entry(frame_input, font=("微软雅黑", 10), width=10)
entry_input.grid(row=0, column=1, padx=5, pady=5)

# 2. 单位选择区域
frame_units = ttk.Frame(root)
frame_units.pack(pady=5)

combo_from = ttk.Combobox(frame_units, values=list(CONVERSION_FACTORS.keys()), width=10, state="readonly")
combo_from.grid(row=0, column=0, padx=5)
combo_from.current(0)  # 默认选中千克

btn_swap = ttk.Button(frame_units, text="↔", width=3, command=swap_units)
btn_swap.grid(row=0, column=1, padx=5)

combo_to = ttk.Combobox(frame_units, values=list(CONVERSION_FACTORS.keys()), width=10, state="readonly")
combo_to.grid(row=0, column=2, padx=5)
combo_to.current(2)  # 默认选中斤

# 3. 转换按钮和结果区域
frame_result = ttk.Frame(root)
frame_result.pack(pady=15)

btn_convert = ttk.Button(frame_result, text="开始转换", command=convert_weight)
btn_convert.grid(row=0, column=0, padx=10)

label_result = ttk.Label(frame_result, text="转换结果：", font=("微软雅黑", 10))
label_result.grid(row=0, column=1, padx=10)

# 启动主循环
if __name__ == "__main__":
    root.mainloop()