import tkinter as tk
from tkinter import ttk

# 单位换算基准：全部换算成米作为中间值
unit_to_meter = {
    "千米(km)": 1000,
    "米(m)": 1,
    "分米(dm)": 0.1,
    "厘米(cm)": 0.01,
    "毫米(mm)": 0.001,
    "英里(mi)": 1609.34,
    "码(yd)": 0.9144,
    "英尺(ft)": 0.3048,
    "英寸(in)": 0.0254
}
unit_list = list(unit_to_meter.keys())

def calculate():
    """执行单位换算计算"""
    try:
        num = float(input_entry.get())
        from_unit = combo_from.get()
        to_unit = combo_to.get()
        # 转为米，再转为目标单位
        meter_val = num * unit_to_meter[from_unit]
        result = meter_val / unit_to_meter[to_unit]
        result_var.set(f"{result:.6f}")
    except ValueError:
        result_var.set("输入数字")

def swap_unit():
    """交换两个下拉框的单位"""
    temp = combo_from.get()
    combo_from.set(combo_to.get())
    combo_to.set(temp)
    calculate()

def clear_all():
    """清空输入输出"""
    input_entry.delete(0, tk.END)
    result_var.set("")

# 创建主窗口
root = tk.Tk()
root.title("长度单位转换器")
root.geometry("480x280")
root.resizable(False, False)
root.configure(bg="#f0f4f8")

# 变量绑定
result_var = tk.StringVar()

# 标题
title_label = tk.Label(root, text="长度单位转换器", font=("微软雅黑", 18, "bold"), bg="#f0f4f8", fg="#224477")
title_label.pack(pady=15)

# 主体框架
main_frame = tk.Frame(root, bg="#f0f4f8")
main_frame.pack()

# 输入区域
tk.Label(main_frame, text="输入数值：", font=("微软雅黑", 12), bg="#f0f4f8").grid(row=0, column=0, padx=8, pady=10)
input_entry = tk.Entry(main_frame, width=14, font=("微软雅黑", 12), justify="center")
input_entry.grid(row=0, column=1, padx=8, pady=10)
input_entry.bind("<KeyRelease>", lambda e: calculate())  # 输入实时计算

# 来源单位
tk.Label(main_frame, text="原单位：", font=("微软雅黑", 12), bg="#f0f4f8").grid(row=1, column=0, padx=8, pady=8)
combo_from = ttk.Combobox(main_frame, values=unit_list, width=14, font=("微软雅黑", 10), state="readonly")
combo_from.current(1)  # 默认选中米
combo_from.grid(row=1, column=1, padx=8, pady=8)
combo_from.bind("<<ComboboxSelected>>", lambda e: calculate())

# 目标单位
tk.Label(main_frame, text="目标单位：", font=("微软雅黑", 12), bg="#f0f4f8").grid(row=2, column=0, padx=8, pady=8)
combo_to = ttk.Combobox(main_frame, values=unit_list, width=14, font=("微软雅黑", 10), state="readonly")
combo_to.current(3)  # 默认选中厘米
combo_to.grid(row=2, column=1, padx=8, pady=8)
combo_to.bind("<<ComboboxSelected>>", lambda e: calculate())

# 结果显示
tk.Label(main_frame, text="转换结果：", font=("微软雅黑", 12), bg="#f0f4f8").grid(row=3, column=0, padx=8, pady=10)
res_label = tk.Label(main_frame, textvariable=result_var, width=14, font=("微软雅黑", 12, "bold"), bg="white", relief="solid")
res_label.grid(row=3, column=1, padx=8, pady=10)

# 按钮区域
btn_frame = tk.Frame(root, bg="#f0f4f8")
btn_frame.pack(pady=10)

swap_btn = tk.Button(btn_frame, text="交换单位", command=swap_unit, font=("微软雅黑", 10), bg="#5294e2", fg="white", width=8)
swap_btn.grid(row=0, column=0, padx=10)

clear_btn = tk.Button(btn_frame, text="清空", command=clear_all, font=("微软雅黑", 10), bg="#e74c3c", fg="white", width=8)
clear_btn.grid(row=0, column=1, padx=10)

# 窗口主循环
root.mainloop()