import tkinter as tk
from tkinter import ttk, messagebox

class LengthConverter:
    def __init__(self, root):
        # 主窗口配置
        self.root = root
        self.root.title("长度单位转换器")
        self.root.geometry("500x400")  # 窗口尺寸
        self.root.resizable(False, False)  # 禁止调整窗口大小

        # 定义单位换算基准（所有单位转换为米的系数）
        self.unit_to_meter = {
            "毫米(mm)": 0.001,
            "厘米(cm)": 0.01,
            "米(m)": 1.0,
            "千米(km)": 1000.0,
            "英寸(in)": 0.0254,
            "英尺(ft)": 0.3048
        }

        # 创建界面组件
        self.create_widgets()

    def create_widgets(self):
        # 1. 输入区域
        input_frame = ttk.Frame(self.root, padding="10")
        input_frame.pack(fill=tk.X, padx=20, pady=10)

        ttk.Label(input_frame, text="输入长度值：").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
        self.length_entry = ttk.Entry(input_frame, width=20)
        self.length_entry.grid(row=0, column=1, padx=5, pady=5)
        self.length_entry.focus()  # 默认聚焦输入框

        # 2. 单位选择区域
        unit_frame = ttk.Frame(self.root, padding="10")
        unit_frame.pack(fill=tk.X, padx=20, pady=5)

        ttk.Label(unit_frame, text="原始单位：").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
        self.from_unit = ttk.Combobox(
            unit_frame, 
            values=list(self.unit_to_meter.keys()),  # 从基准字典获取单位列表
            width=12
        )
        self.from_unit.current(2)  # 默认选中"米(m)"
        self.from_unit.grid(row=0, column=1, padx=5, pady=5)

        ttk.Label(unit_frame, text="目标单位：").grid(row=0, column=2, padx=5, pady=5, sticky=tk.W)
        self.to_unit = ttk.Combobox(
            unit_frame, 
            values=list(self.unit_to_meter.keys()),
            width=12
        )
        self.to_unit.current(1)  # 默认选中"厘米(cm)"
        self.to_unit.grid(row=0, column=3, padx=5, pady=5)

        # 3. 功能按钮区域
        btn_frame = ttk.Frame(self.root, padding="10")
        btn_frame.pack(fill=tk.X, padx=20, pady=10)

        convert_btn = ttk.Button(btn_frame, text="转换", command=self.convert_length)
        convert_btn.grid(row=0, column=0, padx=5, pady=5)

        clear_btn = ttk.Button(btn_frame, text="清空", command=self.clear_input)
        clear_btn.grid(row=0, column=1, padx=5, pady=5)

        # 4. 结果显示区域
        result_frame = ttk.Frame(self.root, padding="10")
        result_frame.pack(fill=tk.X, padx=20, pady=5)

        ttk.Label(result_frame, text="转换结果：").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)
        self.result_label = ttk.Label(
            result_frame, 
            text="", 
            foreground="darkgreen", 
            font=("Arial", 11, "bold")
        )
        self.result_label.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W)

    def convert_length(self):
        """核心转换逻辑：先统一转米，再转目标单位"""
        try:
            # 获取输入值和单位
            length_value = float(self.length_entry.get())
            from_unit = self.from_unit.get()
            to_unit = self.to_unit.get()

            # 校验单位是否有效
            if from_unit not in self.unit_to_meter or to_unit not in self.unit_to_meter:
                messagebox.showerror("错误", "请选择有效的长度单位")
                return

            # 第一步：原始单位转米
            meter_value = length_value * self.unit_to_meter[from_unit]

            # 第二步：米转目标单位
            target_value = meter_value / self.unit_to_meter[to_unit]

            # 显示结果（根据数值大小保留合适小数位）
            if target_value >= 1000 or target_value < 0.001:
                result_text = f"{length_value} {from_unit} = {target_value:.6f} {to_unit}"
            else:
                result_text = f"{length_value} {from_unit} = {target_value:.4f} {to_unit}"
            
            self.result_label.config(text=result_text)

        except ValueError:
            # 输入非数字的异常处理
            messagebox.showerror("输入错误", "请输入有效的数字（如 10、25.5）")
            self.length_entry.delete(0, tk.END)
            self.length_entry.focus()
        except Exception as e:
            # 其他未知异常
            messagebox.showerror("错误", f"转换失败：{str(e)}")

    def clear_input(self):
        """清空输入和结果，重置单位选择"""
        self.length_entry.delete(0, tk.END)
        self.result_label.config(text="")
        self.from_unit.current(2)
        self.to_unit.current(1)
        self.length_entry.focus()

# 程序入口
if __name__ == "__main__":
    root = tk.Tk()
    app = LengthConverter(root)
    root.mainloop()