from tkinter import *
from tkinter import messagebox

# ---------------------- 数据配置 ----------------------
# 星座：(月份,日期,星座名,简介)
constellation_data = [
    ((1, 20), "水瓶座", "独立创新，思维独特，追求自由，富有人道主义精神"),
    ((2, 19), "双鱼座", "温柔浪漫，想象力丰富，共情力强，感性心软"),
    ((3, 21), "白羊座", "热情冲动，勇敢直率，行动力强，敢爱敢恨"),
    ((4, 20), "金牛座", "踏实稳重，热爱美好，慢热专一，擅长积累财富"),
    ((5, 21), "双子座", "思维灵活，善于沟通，好奇心重，多变有趣"),
    ((6, 22), "巨蟹座", "顾家温柔，内心敏感，重视安全感，保护欲强"),
    ((7, 23), "狮子座", "自信大方，热情耀眼，爱面子，天生领导者"),
    ((8, 23), "处女座", "细致严谨，追求完美，内心善良，做事靠谱"),
    ((9, 23), "天秤座", "颜值出众，追求公平，纠结选择，待人温和"),
    ((10, 24), "天蝎座", "爱恨分明，洞察力强，专一深情，隐忍坚韧"),
    ((11, 23), "射手座", "乐观自由，热爱冒险，心胸开阔，讨厌束缚"),
    ((12, 22), "摩羯座", "隐忍努力，目标明确，成熟稳重，吃苦耐劳"),
    ((12, 32), "摩羯座", "隐忍努力，目标明确，成熟稳重，吃苦耐劳"),
]

# 生肖顺序
zodiac_list = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]

# ---------------------- 核心计算函数 ----------------------
def get_constellation(month, day):
    """根据月日获取星座"""
    for (m, d), name, desc in constellation_data:
        if month < m or (month == m and day <= d):
            return name, desc
    return "摩羯座", constellation_data[-1][2]

def get_zodiac(year):
    """根据年份计算生肖，1900为鼠年基准"""
    base_year = 1900
    index = (year - base_year) % 12
    return zodiac_list[index]

def query_info():
    """查询按钮触发逻辑"""
    year_str = entry_year.get().strip()
    month_str = entry_month.get().strip()
    day_str = entry_day.get().strip()

    # 空值判断
    if not year_str or not month_str or not day_str:
        messagebox.showwarning("输入提醒", "年份、月份、日期不能为空！")
        return

    try:
        year = int(year_str)
        month = int(month_str)
        day = int(day_str)
    except ValueError:
        messagebox.showerror("格式错误", "请输入纯数字！例：2000 05 20")
        return

    # 日期范围校验
    if not (1900 <= year <= 2100):
        messagebox.showerror("年份错误", "请输入1900~2100之间的年份")
        return
    if not (1 <= month <= 12):
        messagebox.showerror("月份错误", "月份范围 1~12")
        return
    if not (1 <= day <= 31):
        messagebox.showerror("日期错误", "日期范围 1~31")
        return

    # 计算结果
    shengxiao = get_zodiac(year)
    xingzuo, desc = get_constellation(month, day)

    # 清空输出框并写入结果
    result_text.delete(1.0, END)
    res = f"==== 查询结果 ====\n"
    res += f"出生年份：{year}年\n"
    res += f"生  肖：{shengxiao}\n"
    res += f"星  座：{xingzuo}\n\n"
    res += f"星座简介：\n{desc}"
    result_text.insert(END, res)

def clear_all():
    """清空输入和结果"""
    entry_year.delete(0, END)
    entry_month.delete(0, END)
    entry_day.delete(0, END)
    result_text.delete(1.0, END)

# ---------------------- GUI界面搭建 ----------------------
root = Tk()
root.title("星座生肖查询器")
root.geometry("460x380")
root.resizable(False, False)

# 输入区域框架
frame_input = Frame(root, pady=15)
frame_input.pack()

Label(frame_input, text="出生年份：", font=("微软雅黑", 11)).grid(row=0, column=0, sticky=W, pady=6)
entry_year = Entry(frame_input, width=12, font=("微软雅黑", 11))
entry_year.grid(row=0, column=1, padx=10)

Label(frame_input, text="出生月份：", font=("微软雅黑", 11)).grid(row=0, column=2, sticky=W, pady=6)
entry_month = Entry(frame_input, width=6, font=("微软雅黑", 11))
entry_month.grid(row=0, column=3, padx=10)

Label(frame_input, text="出生日期：", font=("微软雅黑", 11)).grid(row=1, column=0, sticky=W, pady=6)
entry_day = Entry(frame_input, width=6, font=("微软雅黑", 11))
entry_day.grid(row=1, column=1, padx=10)

# 按钮区域
frame_btn = Frame(root, pady=8)
frame_btn.pack()

Button(frame_btn, text="开始查询", width=12, font=("微软雅黑",10), command=query_info).grid(row=0, column=0, padx=8)
Button(frame_btn, text="清空全部", width=12, font=("微软雅黑",10), command=clear_all).grid(row=0, column=1, padx=8)

# 结果展示区
Label(root, text="查询结果", font=("微软雅黑",12,"bold")).pack()
result_text = Text(root, width=52, height=11, font=("微软雅黑", 10))
result_text.pack(pady=5)

root.mainloop()