import tkinter as tk
from tkinter import ttk

# 转换函数：输入数值和单位，自动换算所有单位
def convert_length(*args):
    try:
        # 获取输入值
        value = float(input_entry.get())
        # 获取当前选择的输入单位
        input_unit = input_combo.get()
        
        # 先统一转换成 米（基准单位）
        meters = 0
        if input_unit == "米 (m)":
            meters = value
        elif input_unit == "厘米 (cm)":
            meters = value / 100
        elif input_unit == "毫米 (mm)":
            meters = value / 1000
        elif input_unit == "千米 (km)":
            meters = value * 1000
        elif input_unit == "英寸 (inch)":
            meters = value * 0.0254
        elif input_unit == "英尺 (ft)":
            meters = value * 0.3048

        # 根据米计算所有其他单位并显示
        meter_label.config(text=f"{meters:.4f}")
        cm_label.config(text=f"{meters * 100:.4f}")
        mm_label.config(text=f"{meters * 1000:.4f}")
        km_label.config(text=f"{meters / 1000:.4f}")
        inch_label.config(text=f"{meters / 0.0254:.4f}")
        ft_label.config(text=f"{meters / 0.3048:.4f}")
    
    # 输入非数字时清空结果
    except ValueError:
        meter_label.config(text="")
        cm_label.config(text="")
        mm_label.config(text="")
        km_label.config(text="")
        inch_label.config(text="")
        ft_label.config(text="")

# 创建主窗口
root = tk.Tk()
root.title("长度单位转换器")
root.geometry("450x320")  # 窗口大小
root.resizable(False, False)  # 禁止缩放

# 样式设置
style = ttk.Style()
style.configure("TLabel", font=("微软雅黑", 11))
style.configure("TButton", font=("微软雅黑", 11))

# ========== 输入区域 ==========
input_frame = ttk.LabelFrame(root, text="输入", padding=10)
input_frame.pack(fill="x", padx=15, pady=10)

# 数值输入框
input_entry = ttk.Entry(input_frame, font=("微软雅黑", 12))
input_entry.grid(row=0, column=0, padx=5, pady=5)
input_entry.bind("<KeyRelease>", convert_length)  # 输入时自动转换

# 单位选择下拉框
units = ["米 (m)", "厘米 (cm)", "毫米 (mm)", "千米 (km)", "英寸 (inch)", "英尺 (ft)"]
input_combo = ttk.Combobox(input_frame, values=units, state="readonly", font=("微软雅黑", 11))
input_combo.grid(row=0, column=1, padx=5, pady=5)
input_combo.current(0)  # 默认选米
input_combo.bind("<<ComboboxSelected>>", convert_length)

# 转换按钮
convert_btn = ttk.Button(input_frame, text="转换", command=convert_length)
convert_btn.grid(row=0, column=2, padx=10, pady=5)

# ========== 结果显示区域 ==========
result_frame = ttk.LabelFrame(root, text="转换结果", padding=10)
result_frame.pack(fill="both", expand=True, padx=15, pady=5)

# 布局结果标签
row = 0
ttk.Label(result_frame, text="米 (m):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
meter_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
meter_label.grid(row=row, column=1, sticky="w", padx=5)

row += 1
ttk.Label(result_frame, text="厘米 (cm):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
cm_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
cm_label.grid(row=row, column=1, sticky="w", padx=5)

row += 1
ttk.Label(result_frame, text="毫米 (mm):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
mm_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
mm_label.grid(row=row, column=1, sticky="w", padx=5)

row += 1
ttk.Label(result_frame, text="千米 (km):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
km_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
km_label.grid(row=row, column=1, sticky="w", padx=5)

row += 1
ttk.Label(result_frame, text="英寸 (inch):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
inch_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
inch_label.grid(row=row, column=1, sticky="w", padx=5)

row += 1
ttk.Label(result_frame, text="英尺 (ft):").grid(row=row, column=0, sticky="w", padx=5, pady=4)
ft_label = ttk.Label(result_frame, text="", font=("微软雅黑", 11))
ft_label.grid(row=row, column=1, sticky="w", padx=5)

# 运行主循环
root.mainloop()