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

class ZodiacConstellationQuery:
    def __init__(self, root):
        self.root = root
        self.root.title("星座生肖查询器")
        self.root.geometry("520x400")
        self.root.resizable(False, False)
        self.root.configure(bg="#f0f4f8")

        # 生肖数据表(农历年份分界简化算法，通用够用)
        self.zodiac_list = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
        # 星座分界日期 (月,日)
        self.constellation_data = [
            ((1, 20), (2, 18), "水瓶座", "独立理智，追求自由，脑洞大，待人友善"),
            ((2, 19), (3, 20), "双鱼座", "温柔浪漫，共情力强，内心敏感富有想象力"),
            ((3, 21), (4, 19), "白羊座", "热情冲动，行动力拉满，直率勇敢脾气来得快去得快"),
            ((4, 20), (5, 20), "金牛座", "稳重务实，喜欢安稳，审美佳，固执慢热"),
            ((5, 21), (6, 21), "双子座", "思维灵活，擅长沟通，好奇心重，容易三分钟热度"),
            ((6, 22), (7, 22), "巨蟹座", "顾家恋旧，心思细腻，极度缺乏安全感"),
            ((7, 23), (8, 22), "狮子座", "自信大方，爱面子讲义气，天生自带气场"),
            ((8, 23), (9, 22), "处女座", "细心严谨，追求完美，观察力极强"),
            ((9, 23), (10, 23), "天秤座", "颜值出众，纠结犹豫，讨厌冲突待人公平"),
            ((10, 24), (11, 22), "天蝎座", "深情专一，洞察力强，记仇且占有欲较强"),
            ((11, 23), (12, 21), "射手座", "乐观开朗，向往远方，讨厌束缚自由至上"),
            ((12, 22), (1, 19), "摩羯座", "隐忍努力，事业心重，成熟稳重抗压能力强")
        ]
        self.create_ui()

    def create_ui(self):
        # 标题
        title_label = tk.Label(self.root, text="星座 · 生肖一键查询", font=("微软雅黑", 16, "bold"), bg="#f0f4f8", fg="#2c3e50")
        title_label.pack(pady=15)

        # 输入框架
        input_frame = tk.Frame(self.root, bg="#f0f4f8")
        input_frame.pack()

        tk.Label(input_frame, text="出生年份：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=0, padx=5, pady=8)
        self.var_year = tk.StringVar()
        ttk.Entry(input_frame, textvariable=self.var_year, width=8, font=("微软雅黑", 11)).grid(row=0, column=1, padx=5)

        tk.Label(input_frame, text="出生月份：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=2, padx=5, pady=8)
        self.var_month = tk.StringVar()
        ttk.Entry(input_frame, textvariable=self.var_month, width=5, font=("微软雅黑", 11)).grid(row=0, column=3, padx=5)

        tk.Label(input_frame, text="出生日期：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=4, padx=5, pady=8)
        self.var_day = tk.StringVar()
        ttk.Entry(input_frame, textvariable=self.var_day, width=5, font=("微软雅黑", 11)).grid(row=0, column=5, padx=5)

        # 查询按钮
        query_btn = tk.Button(self.root, text="开始查询", command=self.do_query,
                              bg="#3498db", fg="white", font=("微软雅黑", 11), relief="flat", padx=20)
        query_btn.pack(pady=12)

        # 结果显示框
        result_frame = tk.LabelFrame(self.root, text="查询结果", font=("微软雅黑", 11), bg="#ffffff", fg="#2c3e50")
        result_frame.pack(fill="x", padx=30, pady=5, ipady=10)

        self.result_text = tk.Text(result_frame, height=8, width=55, font=("微软雅黑", 10), bg="#f8fafc")
        self.result_text.pack(padx=10)

        # 清空按钮
        clear_btn = tk.Button(self.root, text="清空内容", command=self.clear_all,
                              bg="#e74c3c", fg="white", font=("微软雅黑", 10), relief="flat")
        clear_btn.pack(pady=10)

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

    # 计算星座
    def get_constellation(self, month, day):
        for start, end, name, desc in self.constellation_data:
            s_month, s_day = start
            e_month, e_day = end
            # 正常区间
            if (s_month < e_month):
                if (month == s_month and day >= s_day) or (month == e_month and day <= e_day):
                    return name, desc
            # 跨年区间（摩羯：12.22 ~ 1.19）
            else:
                if (month == s_month and day >= s_day) or (month == e_month and day <= e_day):
                    return name, desc
        return "未知", "日期异常"

    # 查询主逻辑
    def do_query(self):
        y_str = self.var_year.get().strip()
        m_str = self.var_month.get().strip()
        d_str = self.var_day.get().strip()
        try:
            year = int(y_str)
            month = int(m_str)
            day = int(d_str)
            # 基础范围校验
            if year < 1900 or year > 2100:
                messagebox.showwarning("范围提示", "年份请输入1900~2100之间")
                return
            datetime(year, month, day)
        except ValueError:
            messagebox.showerror("输入错误", "请填写合法的数字年月日！")
            return

        zodiac = self.get_zodiac(year)
        cons_name, cons_desc = self.get_constellation(month, day)

        # 写入文本框
        self.result_text.delete(1.0, tk.END)
        info = f"出生年月日：{year}年{month}月{day}日\n"
        info += f"你的生肖：{zodiac}年\n"
        info += f"你的星座：{cons_name}\n"
        info += f"星座特质：{cons_desc}"
        self.result_text.insert(tk.END, info)

    # 清空所有输入输出
    def clear_all(self):
        self.var_year.set("")
        self.var_month.set("")
        self.var_day.set("")
        self.result_text.delete(1.0, tk.END)

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