import tkinter as tk
from tkinter import ttk, messagebox

# 实时汇率（参考常用实时中间价，数值可自行更新修改）
RATE_DATA = {
    "CNY": {"CNY": 1, "USD": 0.137, "EUR": 0.126, "GBP": 0.108, "JPY": 20.52, "KRW": 190.3},
    "USD": {"CNY": 7.30, "USD": 1, "EUR": 0.92, "GBP": 0.79, "JPY": 149.8, "KRW": 1389.5},
    "EUR": {"CNY": 7.92, "USD": 1.087, "EUR": 1, "GBP": 0.86, "JPY": 162.9, "KRW": 1511.2},
    "GBP": {"CNY": 9.26, "USD": 1.268, "EUR": 1.163, "GBP": 1, "JPY": 189.5, "KRW": 1759.8},
    "JPY": {"CNY": 0.0487, "USD": 0.00667, "EUR": 0.00614, "GBP": 0.00528, "JPY": 1, "KRW": 9.28},
    "KRW": {"CNY": 0.00526, "USD": 0.00072, "EUR": 0.00066, "GBP": 0.00057, "JPY": 0.1077, "KRW": 1}
}
# 货币中文名称映射
CURRENCY_NAME = {
    "CNY": "人民币(CNY)",
    "USD": "美元(USD)",
    "EUR": "欧元(EUR)",
    "GBP": "英镑(GBP)",
    "JPY": "日元(JPY)",
    "KRW": "韩元(KRW)"
}
CUR_LIST = list(CURRENCY_NAME.keys())


class CurrencyConverterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("货币单位转换器")
        self.root.geometry("420x320")
        self.root.resizable(False, False)

        # 布局主容器
        main_frame = ttk.Frame(root, padding=30)
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 输入金额
        ttk.Label(main_frame, text="输入金额：", font=("微软雅黑", 11)).grid(row=0, column=0, sticky="w", pady=8)
        self.amount_var = tk.StringVar()
        amount_entry = ttk.Entry(main_frame, textvariable=self.amount_var, font=("微软雅黑", 11), width=22)
        amount_entry.grid(row=0, column=1, padx=10)

        # 原始货币
        ttk.Label(main_frame, text="原始货币：", font=("微软雅黑", 11)).grid(row=1, column=0, sticky="w", pady=8)
        self.from_cur = ttk.Combobox(main_frame, values=[CURRENCY_NAME[k] for k in CUR_LIST], state="readonly", width=20, font=("微软雅黑", 10))
        self.from_cur.current(0)
        self.from_cur.grid(row=1, column=1, padx=10)

        # 目标货币
        ttk.Label(main_frame, text="转换货币：", font=("微软雅黑", 11)).grid(row=2, column=0, sticky="w", pady=8)
        self.to_cur = ttk.Combobox(main_frame, values=[CURRENCY_NAME[k] for k in CUR_LIST], state="readonly", width=20, font=("微软雅黑", 10))
        self.to_cur.current(1)
        self.to_cur.grid(row=2, column=1, padx=10)

        # 结果展示
        ttk.Label(main_frame, text="转换结果：", font=("微软雅黑", 11)).grid(row=3, column=0, sticky="w", pady=8)
        self.result_var = tk.StringVar(value="0.00")
        res_label = ttk.Label(main_frame, textvariable=self.result_var, font=("微软雅黑", 12, "bold"), foreground="#2266cc")
        res_label.grid(row=3, column=1, padx=10)

        # 按钮区域
        btn_frame = ttk.Frame(main_frame)
        btn_frame.grid(row=4, column=0, columnspan=2, pady=20)

        convert_btn = ttk.Button(btn_frame, text="开始转换", command=self.do_convert)
        convert_btn.grid(row=0, column=0, padx=12)

        clear_btn = ttk.Button(btn_frame, text="清空重置", command=self.clear_all)
        clear_btn.grid(row=0, column=1, padx=12)

    def do_convert(self):
        """执行换算计算"""
        try:
            amount = float(self.amount_var.get())
            if amount < 0:
                messagebox.showwarning("提示", "金额不能为负数！")
                return
            # 提取货币代码
            from_text = self.from_cur.get()
            to_text = self.to_cur.get()
            from_code = [k for k, v in CURRENCY_NAME.items() if v == from_text][0]
            to_code = [k for k, v in CURRENCY_NAME.items() if v == to_text][0]
            # 计算
            rate = RATE_DATA[from_code][to_code]
            res = amount * rate
            self.result_var.set(f"{res:.2f}")
        except ValueError:
            messagebox.showerror("输入错误", "请输入合法数字金额！")
        except Exception as e:
            messagebox.showerror("错误", str(e))

    def clear_all(self):
        """清空所有内容"""
        self.amount_var.set("")
        self.result_var.set("0.00")
        self.from_cur.current(0)
        self.to_cur.current(1)


if __name__ == "__main__":
    window = tk.Tk()
    app = CurrencyConverterGUI(window)
    window.mainloop()