from tkinter import *
from tkinter import messagebox

# ---------------------- 生肖计算（农历年份简易换算，按春节分界，这里用年份粗略匹配日常查询够用） ----------------------
def get_zodiac(year):
    zodiac_list = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
    index = (year - 4) % 12
    return zodiac_list[index]

# ---------------------- 星座判断 ----------------------
def get_constellation(month, day):
    if (month == 1 and day >= 20) or (month == 2 and day <= 18):
        return ("水瓶座", "独立叛逆，向往自由，脑洞大开，友善博爱")
    elif (month == 2 and day >= 19) or (month == 3 and day <= 20):
        return ("双鱼座", "温柔浪漫，共情力强，内心细腻，富有想象力")
    elif (month == 3 and day >= 21) or (month == 4 and day <= 19):
        return ("白羊座", "热情冲动，直率勇敢，行动力拉满，讲义气")
    elif (month == 4 and day >= 20) or (month == 5 and day <= 20):
        return ("金牛座", "稳重踏实，喜欢美食好物，慢热专一，吃苦耐劳")
    elif (month == 5 and day >= 21) or (month == 6 and day <= 21):
        return ("双子座", "思维灵活，口才出众，好奇心重，善于社交")
    elif (month == 6 and day >= 22) or (month == 7 and day <= 22):
        return ("巨蟹座", "顾家恋旧，心思敏感，温柔体贴，保护欲强")
    elif (month == 7 and day >= 23) or (month == 8 and day <= 22):
        return ("狮子座", "自信霸气，慷慨大方，爱面子，天生领导者")
    elif (month == 8 and day >= 23) or (month == 9 and day <= 22):
        return ("处女座", "细心严谨，追求完美，做事认真，内心温柔")
    elif (month == 9 and day >= 23) or (month == 10 and day <= 23):
        return ("天秤座", "颜值出众，追求公平，纠结选择，待人温和")
    elif (month == 10 and day >= 24) or (month == 11 and day <= 22):
        return ("天蝎座", "深情专一，洞察力强，爱恨分明，隐忍强大")
    elif (month == 11 and day >= 23) or (month == 12 and day <= 21):
        return ("射手座", "乐观开朗，热爱自由，心胸豁达，讨厌拘束")
    else:
        return ("摩羯座", "隐忍努力，目标明确，成熟稳重，吃苦耐劳")

# ---------------------- 查询按钮触发函数 ----------------------
def query_info():
    try:
        year = int(entry_year.get())
        month = int(entry_month.get())
        day = int(entry_day.get())
        # 基础日期范围校验
        if not (1 <= month <= 12):
            messagebox.showerror("输入错误", "月份必须是1~12之间的数字")
            return
        if not (1 <= day <= 31):
            messagebox.showerror("输入错误", "日期必须是1~31之间的数字")
            return
        if year < 1900 or year > 2100:
            messagebox.showwarning("年份提示", "建议输入1900-2100之间的年份")

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

        # 清空并写入结果
        result_text.delete(1.0, END)
        res = f"【出生年份】：{year}年\n【生肖属相】：{zodiac}\n【星座】：{cons_name}\n【星座特质】：{cons_desc}"
        result_text.insert(INSERT, res)
    except ValueError:
        messagebox.showerror("格式错误", "请输入纯数字的年月日，不要填写文字、符号！")

# ---------------------- 重置清空 ----------------------
def clear_all():
    entry_year.delete(0, END)
    entry_month.delete(0, END)
    entry_day.delete(0, END)
    result_text.delete(1.0, END)

# ==================== 界面布局 ====================
root = Tk()
root.title("星座生肖查询工具")
root.geometry("420x320")
root.resizable(False, False)  # 禁止缩放窗口
root.configure(bg="#f0f4f8")

# 标题
Label(root, text="星座 & 生肖查询器", font=("微软雅黑", 16, "bold"), bg="#f0f4f8", fg="#2c3e50").pack(pady=12)

# 输入框容器frame
frame_input = Frame(root, bg="#f0f4f8")
frame_input.pack()

Label(frame_input, text="年：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=0, padx=3)
entry_year = Entry(frame_input, width=8, font=("微软雅黑", 11), justify=CENTER)
entry_year.grid(row=0, column=1, padx=4)

Label(frame_input, text="月：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=2, padx=3)
entry_month = Entry(frame_input, width=5, font=("微软雅黑", 11), justify=CENTER)
entry_month.grid(row=0, column=3, padx=4)

Label(frame_input, text="日：", font=("微软雅黑", 11), bg="#f0f4f8").grid(row=0, column=4, padx=3)
entry_day = Entry(frame_input, width=5, font=("微软雅黑", 11), justify=CENTER)
entry_day.grid(row=0, column=5, padx=4)

# 按钮区域
frame_btn = Frame(root, bg="#f0f4f8")
frame_btn.pack(pady=15)
Button(frame_btn, text="开始查询", command=query_info, width=10, bg="#3498db", fg="white", font=("微软雅黑",10)).grid(row=0,column=0,padx=10)
Button(frame_btn, text="清空重置", command=clear_all, width=10, bg="#95a5a6", fg="white", font=("微软雅黑",10)).grid(row=0,column=1,padx=10)

# 结果展示框
Label(root, text="查询结果", font=("微软雅黑",12), bg="#f0f4f8").pack()
result_text = Text(root, width=45, height=7, font=("微软雅黑",10))
result_text.pack(padx=10)

root.mainloop()