import tkinter as tk
from tkinter import ttk, messagebox


class LengthConverterApp:
    def __init__(self, root):
        self.root = root
        self.root.title("长度单位转换器")
        self.root.geometry("400x250")

        # --- 定义单位数据 (基准单位：米) ---
        # 键是显示名称，值是相对于米的换算系数
        self.units = {
            "米 (m)": 1.0,
            "千米 (km)": 1000.0,
            "厘米 (cm)": 0.01,
            "毫米 (mm)": 0.001,
            "英寸 (in)": 0.0254,
            "英尺 (ft)": 0.3048,
            "码 (yd)": 0.9144,
            "英里 (mi)": 1609.34
        }

        # --- 创建界面组件 ---
        self.create_widgets()

    def create_widgets(self):
        # 1. 输入区域
        input_frame = ttk.Frame(self.root, padding=10)
        input_frame.pack(fill="x")

        ttk.Label(input_frame, text="数值:").grid(
            row=0, column=0, padx=5, pady=5, sticky="e")
        self.input_value = tk.DoubleVar(value=1.0)
        self.input_entry = ttk.Entry(
            input_frame, textvariable=self.input_value, width=15)
        self.input_entry.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(input_frame, text="从:").grid(
            row=0, column=2, padx=5, pady=5, sticky="e")
        self.from_unit = ttk.Combobox(input_frame, values=list(
            self.units.keys()), state="readonly", width=12)
        self.from_unit.current(0)  # 默认选中第一个（米）
        self.from_unit.grid(row=0, column=3, padx=5, pady=5)

        # 2. 输出区域
        output_frame = ttk.Frame(self.root, padding=10)
        output_frame.pack(fill="x")

        ttk.Label(output_frame, text="结果:").grid(
            row=0, column=0, padx=5, pady=5, sticky="e")
        self.result_var = tk.StringVar(value="1.0")
        # 使用只读的 Entry 显示结果，看起来更整洁
        self.result_entry = ttk.Entry(
            output_frame, textvariable=self.result_var, state="readonly", width=15)
        self.result_entry.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(output_frame, text="到:").grid(
            row=0, column=2, padx=5, pady=5, sticky="e")
        self.to_unit = ttk.Combobox(output_frame, values=list(
            self.units.keys()), state="readonly", width=12)
        self.to_unit.current(2)  # 默认选中第三个（厘米）
        self.to_unit.grid(row=0, column=3, padx=5, pady=5)

        # 3. 按钮区域
        btn_frame = ttk.Frame(self.root, padding=10)
        btn_frame.pack()

        self.convert_btn = ttk.Button(
            btn_frame, text="转换", command=self.convert)
        self.convert_btn.pack(side="left", padx=10)

        # 绑定回车键事件，按回车也能触发转换
        self.root.bind('<Return>', lambda event: self.convert())

    def convert(self):
        try:
            # 获取输入值
            val = self.input_value.get()
            # 获取选中的单位
            from_name = self.from_unit.get()
            to_name = self.to_unit.get()

            # 1. 转换为基准单位 (米)
            meters = val * self.units[from_name]
            # 2. 转换为目标单位
            result = meters / self.units[to_name]

            # 格式化输出 (去除多余的小数0，最多保留6位小数)
            self.result_var.set(f"{result:.6g}")

        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字！")
        except Exception as e:
            messagebox.showerror("错误", f"发生未知错误: {str(e)}")


if __name__ == "__main__":
    root = tk.Tk()
    app = LengthConverterApp(root)
    root.mainloop()
