import tkinter as tk
from tkinter import messagebox

class LengthConverter:
    def __init__(self, root):
        self.root = root
        self.root.title("长度单位转换器")
        self.root.geometry("500x300")
        self.root.resizable(False, False)

        # 单位与米的换算因子（以米为基准）
        self.units = {
            "毫米 (mm)": 0.001,
            "厘米 (cm)": 0.01,
            "分米 (dm)": 0.1,
            "米 (m)": 1.0,
            "千米 (km)": 1000.0,
            "英寸 (in)": 0.0254,
            "英尺 (ft)": 0.3048,
            "码 (yd)": 0.9144,
            "英里 (mi)": 1609.344
        }
        self.unit_list = list(self.units.keys())

        self.create_widgets()

    def create_widgets(self):
        # 输入数值
        tk.Label(self.root, text="输入数值：", font=("Arial", 12)).grid(row=0, column=0, padx=10, pady=15, sticky="e")
        self.entry_value = tk.Entry(self.root, font=("Arial", 12), width=20)
        self.entry_value.grid(row=0, column=1, padx=5, pady=15, sticky="w")
        self.entry_value.bind("<Return>", lambda event: self.convert())  # 回车触发转换

        # 输入单位
        tk.Label(self.root, text="输入单位：", font=("Arial", 12)).grid(row=1, column=0, padx=10, pady=10, sticky="e")
        self.input_unit_var = tk.StringVar(self.root)
        self.input_unit_var.set(self.unit_list[3])  # 默认 "米 (m)"
        self.input_menu = tk.OptionMenu(self.root, self.input_unit_var, *self.unit_list)
        self.input_menu.config(font=("Arial", 10), width=15)
        self.input_menu.grid(row=1, column=1, padx=5, pady=10, sticky="w")

        # 输出单位
        tk.Label(self.root, text="输出单位：", font=("Arial", 12)).grid(row=2, column=0, padx=10, pady=10, sticky="e")
        self.output_unit_var = tk.StringVar(self.root)
        self.output_unit_var.set(self.unit_list[4])  # 默认 "千米 (km)"
        self.output_menu = tk.OptionMenu(self.root, self.output_unit_var, *self.unit_list)
        self.output_menu.config(font=("Arial", 10), width=15)
        self.output_menu.grid(row=2, column=1, padx=5, pady=10, sticky="w")

        # 转换按钮
        self.convert_btn = tk.Button(self.root, text="转换", font=("Arial", 12), command=self.convert, bg="#4CAF50", fg="white")
        self.convert_btn.grid(row=3, column=0, columnspan=2, pady=20)

        # 结果显示
        tk.Label(self.root, text="转换结果：", font=("Arial", 12)).grid(row=4, column=0, padx=10, pady=10, sticky="e")
        self.result_var = tk.StringVar()
        self.result_label = tk.Label(self.root, textvariable=self.result_var, font=("Arial", 14, "bold"), fg="blue")
        self.result_label.grid(row=4, column=1, padx=5, pady=10, sticky="w")

        # 清空按钮
        self.clear_btn = tk.Button(self.root, text="清空", font=("Arial", 10), command=self.clear_all, bg="#f44336", fg="white")
        self.clear_btn.grid(row=5, column=0, columnspan=2, pady=5)

    def convert(self):
        """执行单位转换"""
        try:
            value = float(self.entry_value.get().strip())
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字！")
            return

        input_unit = self.input_unit_var.get()
        output_unit = self.output_unit_var.get()

        # 先转换为米，再转换为目标单位
        meters = value * self.units[input_unit]
        result = meters / self.units[output_unit]

        # 显示结果，保留适当小数位数
        if result.is_integer():
            self.result_var.set(f"{result:.0f} {output_unit}")
        else:
            self.result_var.set(f"{result:.6f} {output_unit}")

    def clear_all(self):
        """清空输入和结果"""
        self.entry_value.delete(0, tk.END)
        self.result_var.set("")

if __name__ == "__main__":
    root = tk.Tk()
    app = LengthConverter(root)
    root.mainloop()