import tkinter as tk
from tkinter import ttk, messagebox
from datetime import date

class ZodiacApp:
    def __init__(self, root):
        self.root = root
        self.root.title("星座生肖查询器")
        self.root.geometry("420x320")
        self.root.resizable(False, False)

        # 生肖列表 鼠牛虎兔龙蛇马羊猴鸡狗猪
        self.shengxiao = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
        # 星座日期分界 (月,日,星座名)
        self.constellation = [
            (1,20,"水瓶座"),(2,19,"双鱼座"),(3,21,"白羊座"),(4,20,"金牛座"),
            (5,21,"双子座"),(6,22,"巨蟹座"),(7,23,"狮子座"),(8,23,"处女座"),
            (9,23,"天秤座"),(10,24,"天蝎座"),(11,23,"射手座"),(12,22,"摩羯座")
        ]

        # 输入区域
        frame_in = ttk.LabelFrame(root, text="输入出生日期")
        frame_in.pack(padx=12, pady=10, fill="x")

        ttk.Label(frame_in, text="年：").grid(row=0, column=0, padx=3, pady=8)
        self.y_ent = ttk.Entry(frame_in, width=7)
        self.y_ent.grid(row=0, column=1, padx=3)

        ttk.Label(frame_in, text="月：").grid(row=0, column=2, padx=3)
        self.m_ent = ttk.Entry(frame_in, width=5)
        self.m_ent.grid(row=0, column=3, padx=3)

        ttk.Label(frame_in, text="日：").grid(row=0, column=4, padx=3)
        self.d_ent = ttk.Entry(frame_in, width=5)
        self.d_ent.grid(row=0, column=5, padx=3)

        ttk.Button(frame_in, text="查询", command=self.search).grid(row=0, column=6, padx=8)

        # 结果展示区
        frame_out = ttk.LabelFrame(root, text="查询结果")
        frame_out.pack(padx=12, pady=5, fill="both", expand=True)

        self.res_text = tk.Text(frame_out, height=9, width=42, font=("微软雅黑",11))
        self.res_text.pack(padx=5,pady=5)

        # 清空按钮
        ttk.Button(root, text="清空", command=self.clear).pack(pady=3)

    # 计算生肖
    def get_sx(self, year):
        # 1900是鼠年为基准
        idx = (year - 1900) % 12
        return self.shengxiao[idx]

    # 计算星座
    def get_xz(self, mon, day):
        for m,d,name in self.constellation:
            if (mon == m and day >= d) or (mon == m+1 and day < self.constellation[m%12][1]):
                return name
        return "摩羯座"

    # 查询逻辑
    def search(self):
        try:
            y = int(self.y_ent.get())
            m = int(self.m_ent.get())
            d = int(self.d_ent.get())
            birth = date(y,m,d)
            today = date.today()
            # 周岁
            age = today.year - birth.year
            if (today.month, today.day) < (birth.month, birth.day):
                age -= 1
            sx = self.get_sx(y)
            xz = self.get_xz(m,d)

            self.res_text.delete(1.0, tk.END)
            info = f"出生日期：{y}年{m:02d}月{d:02d}日\n"
            info += f"生肖：{sx}年\n"
            info += f"星座：{xz}\n"
            info += f"当前周岁：{age} 岁"
            self.res_text.insert(tk.END, info)
        except ValueError:
            messagebox.showerror("错误","请输入合法数字年月日！")
        except Exception as e:
            messagebox.showerror("错误","日期不存在")

    # 清空输入输出
    def clear(self):
        self.y_ent.delete(0,tk.END)
        self.m_ent.delete(0,tk.END)
        self.d_ent.delete(0,tk.END)
        self.res_text.delete(1.0,tk.END)

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