import tkinter as tk
from tkinter import ttk

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

        # ===== 基准：米 =====
        self.units = {
            "毫米(mm)": 0.001,
            "厘米(cm)": 0.01,
            "分米(dm)": 0.1,
            "米(m)": 1.0,
            "千米(km)": 1000.0,
            "英寸(inch)": 0.0254,
            "英尺(ft)": 0.3048,
            "码(yd)": 0.9144,
            "英里(mile)": 1609.344,
            "海里(n mile)": 1852.0,
            "光年(ly)": 9.4607e15,
        }

        self.unit_names = list(self.units.keys())

        self.build_ui()
        self.convert()

    # ========== UI ==========
    def build_ui(self):
        # 标题
        tk.Label(
            self.root, text="📏 长度单位转换器",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=12)

        # ===== 输入区 =====
        input_frame = tk.LabelFrame(self.root, text="输入", font=("微软雅黑", 10))
        input_frame.pack(padx=25, pady=5, fill=tk.X)

        tk.Label(input_frame, text="数值：").grid(row=0, column=0, padx=5, pady=10, sticky="e")
        self.value_entry = tk.Entry(input_frame, width=14, font=("Consolas", 12))
        self.value_entry.grid(row=0, column=1, padx=5, pady=10)
        self.value_entry.insert(0, "1")

        tk.Label(input_frame, text="单位：").grid(row=0, column=2, padx=5, pady=10, sticky="e")
        self.from_unit = ttk.Combobox(
            input_frame, values=self.unit_names,
            width=12, state="readonly"
        )
        self.from_unit.grid(row=0, column=3, padx=5, pady=10)
        self.from_unit.set("米(m)")

        self.value_entry.bind("<KeyRelease>", lambda e: self.convert())
        self.from_unit.bind("<<ComboboxSelected>>", lambda e: self.convert())

        # ===== 结果区 =====
        result_frame = tk.LabelFrame(self.root, text="转换结果", font=("微软雅黑", 10))
        result_frame.pack(padx=25, pady=10, fill=tk.BOTH, expand=True)

        self.result_labels = {}
        row = 0
        for name in self.unit_names:
            lbl = tk.Label(result_frame, text="", font=("Consolas", 10), anchor="w")
            lbl.grid(row=row, column=0, padx=10, pady=2, sticky="w")
            self.result_labels[name] = lbl
            row += 1

        # ===== 按钮区 =====
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=8)

        tk.Button(
            btn_frame, text="清空",
            width=12, bg="#FF9800", fg="white",
            font=("微软雅黑", 10),
            command=self.clear
        ).pack(side=tk.LEFT, padx=10)

        tk.Button(
            btn_frame, text="退出",
            width=12, bg="#f44336", fg="white",
            font=("微软雅黑", 10),
            command=self.root.quit
        ).pack(side=tk.LEFT, padx=10)

    # ========== 核心逻辑 ==========
    def convert(self):
        try:
            value = float(self.value_entry.get().strip())
        except ValueError:
            for lbl in self.result_labels.values():
                lbl.config(text="--")
            return

        from_unit = self.from_unit.get()
        base_value = value * self.units[from_unit]  # 转为米

        for name in self.unit_names:
            converted = base_value / self.units[name]
            if abs(converted) < 1e-6:
                text = f"{name}: {converted:.10e}"
            elif abs(converted) > 1e8:
                text = f"{name}: {converted:.6e}"
            else:
                text = f"{name}: {converted:.6f}"
            self.result_labels[name].config(text=text)

    def clear(self):
        self.value_entry.delete(0, tk.END)
        self.value_entry.insert(0, "0")
        self.convert()


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