import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("📏 长度单位转换器")
root.geometry("420x300")
root.resizable(False, False)

# ========== 变量 ==========
input_var = tk.StringVar(value="1")
unit_from = tk.StringVar(value="米")
unit_to = tk.StringVar(value="厘米")
result_var = tk.StringVar(value="—")

# ========== 单位定义（统一换算成米）==========
UNITS = {
    "毫米": 0.001,
    "厘米": 0.01,
    "分米": 0.1,
    "米": 1.0,
    "千米": 1000.0,
    "英寸": 0.0254,
    "英尺": 0.3048,
    "码": 0.9144,
    "英里": 1609.344,
}

unit_list = list(UNITS.keys())

# ========== 转换逻辑 ==========
def convert():
    try:
        val = float(input_var.get())
    except:
        result_var.set("请输入有效数字")
        return

    f, t = unit_from.get(), unit_to.get()
    if f not in UNITS or t not in UNITS:
        result_var.set("单位不支持")
        return

    # 先转成米，再转出目标单位
    meters = val * UNITS[f]
    out = meters / UNITS[t]

    result_var.set(f"{val:.4g} {f} = {out:.6g} {t}")


def swap():
    a, b = unit_from.get(), unit_to.get()
    unit_from.set(b)
    unit_to.set(a)
    convert()


# ========== 界面 ==========
ttk.Label(root, text="📏 长度单位转换器", font=("Microsoft YaHei", 16, "bold")).pack(pady=12)

# 输入行
f1 = ttk.Frame(root)
f1.pack(pady=5)
ttk.Label(f1, text="长度：").pack(side="left")
ttk.Entry(f1, textvariable=input_var, width=14, font=("Microsoft YaHei", 11)).pack(side="left", padx=5)

# 单位选择行
f2 = ttk.Frame(root)
f2.pack(pady=5)
ttk.Label(f2, text="从：").pack(side="left")
ttk.Combobox(f2, textvariable=unit_from, values=unit_list, state="readonly", width=8).pack(side="left", padx=5)
ttk.Label(f2, text="到：").pack(side="left", padx=(10, 0))
ttk.Combobox(f2, textvariable=unit_to, values=unit_list, state="readonly", width=8).pack(side="left", padx=5)

# 按钮区
bf = ttk.Frame(root)
bf.pack(pady=12)
ttk.Button(bf, text="换算", command=convert).pack(side="left", padx=8)
ttk.Button(bf, text="交换", command=swap).pack(side="left", padx=8)
ttk.Button(bf, text="清空", command=lambda: (input_var.set(""), result_var.set("—"))).pack(side="left", padx=8)

# 结果
ttk.Label(root, textvariable=result_var, font=("Microsoft YaHei", 13, "bold"), foreground="#1a73e8").pack(pady=10)

# 提示
ttk.Label(root, text="支持：毫米/厘米/分米/米/千米/英寸/英尺/码/英里",
          font=("Microsoft YaHei", 9), foreground="#888").pack(pady=5)

# 回车触发
root.bind("<Return>", lambda e: convert())

convert()
root.mainloop()