import tkinter as tk
from tkinter import ttk

def convert_length():
    # 单位：换算为米的系数
    unit_rate = {
        "千米 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
    }
    try:
        # 获取输入数字
        origin_num = float(input_entry.get())
        unit_origin = combo_origin.get()
        unit_target = combo_target.get()

        # 先统一转成米，再转目标单位
        meter_total = origin_num * unit_rate[unit_origin]
        final = meter_total / unit_rate[unit_target]

        result_label.config(text=f"换算结果：{final:.4f}")
    except ValueError:
        result_label.config(text="错误：请输入合法数字")
    except KeyError:
        result_label.config(text="错误：请选择单位")

# 主窗口配置
window = tk.Tk()
window.title("长度单位转换器")
window.geometry("460x220")
window.resizable(False, False)

# 所有单位列表
unit_options = list([k for k in {
    "千米 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
}])

# 输入数值
tk.Label(window, text="输入数值：", font=("微软雅黑", 11)).place(x=30, y=25)
input_entry = tk.Entry(window, font=("微软雅黑", 11), width=16)
input_entry.place(x=110, y=25)

# 原始单位
tk.Label(window, text="原始单位：", font=("微软雅黑", 11)).place(x=30, y=70)
combo_origin = ttk.Combobox(window, values=unit_options, width=14, font=("微软雅黑", 10))
combo_origin.current(1)  # 默认选中米
combo_origin.place(x=110, y=70)

# 目标单位
tk.Label(window, text="目标单位：", font=("微软雅黑", 11)).place(x=250, y=70)
combo_target = ttk.Combobox(window, values=unit_options, width=14, font=("微软雅黑", 10))
combo_target.current(3)  # 默认选中厘米
combo_target.place(x=325, y=70)

# 转换按钮
convert_btn = tk.Button(
    window,
    text="开始转换",
    command=convert_length,
    font=("微软雅黑", 11),
    bg="#4096ee",
    fg="white"
)
convert_btn.place(x=165, y=115, width=120, height=30)

# 结果展示
result_label = tk.Label(window, text="换算结果：", font=("微软雅黑", 12, "bold"), fg="#222222")
result_label.place(x=30, y=165)

window.mainloop()