Python写一个查星座的小程序,适合初学者练手——字典和if语句练习
一、界面预览
二、完整代码
# 导入必要的库
import tkinter as tk
from tkinter import ttk # 导入ttk模块用于更现代的控件
from PIL import Image, ImageTk # 用于处理图片
import os # 用于文件路径操作
class ZodiacApp:
def __init__(self, root):
self.root = root
self.root.title("星座查询系统")
self.root.geometry("520x520") # 设置窗口大小
# 星座信息字典(核心数据)
self.zodiac_info = {
"白羊座": {
"日期": "3.21-4.19",
"特点": "热情、勇敢、冲动、直率、乐观、自信",
"图片": "aries.jpg"
},
"金牛座": {
"日期": "4.20-5.20",
"特点": "稳重、固执、务实、享受、忠诚、耐心",
"图片": "taurus.jpg"
},
"双子座": {
"日期": "5.21-6.21",
"特点": "机智、善变、好奇、聪明、适应力强、交际能力强",
"图片": "gemini.jpg"
},
"巨蟹座": {
"日期": "6.22-7.22",
"特点": "敏感、重情、顾家、善良、保守、有同情心",
"图片": "cancer.jpg"
},
"狮子座": {
"日期": "7.23-8.22",
"特点": "自信、慷慨、领导力强、爱面子、热情、创造力强",
"图片": "leo.jpg"
},
"处女座": {
"日期": "8.23-9.22",
"特点": "完美主义、细心、实际、理性、勤奋、挑剔",
"图片": "virgo.jpg"
},
"天秤座": {
"日期": "9.23-10.23",
"特点": "优雅、公正、追求和谐、犹豫不决、社交能力强、浪漫",
"图片": "libra.jpg"
},
"天蝎座": {
"日期": "10.24-11.22",
"特点": "神秘、热情、占有欲强、直觉敏锐、忠诚、执着",
"图片": "scorpio.jpg"
},
"射手座": {
"日期": "11.23-12.21",
"特点": "乐观、自由、冒险、诚实、幽默、理想主义",
"图片": "sagittarius.jpg"
},
"摩羯座": {
"日期": "12.22-1.19",
"特点": "务实、野心、责任感强、保守、耐心、自律",
"图片": "capricorn.jpg"
},
"水瓶座": {
"日期": "1.20-2.18",
"特点": "创新、人道主义、独立、叛逆、理性、友善",
"图片": "aquarius.jpg"
},
"双鱼座": {
"日期": "2.19-3.20",
"特点": "浪漫、富有同情心、艺术感强、理想主义、敏感、直觉强",
"图片": "pisces.jpg"
}
}
# 创建主界面布局
self._create_widgets()
def _create_widgets(self):
"""创建并布局所有GUI组件"""
# 主框架
self.main_frame = ttk.Frame(self.root, padding="20")
self.main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
# 输入区域
self._create_input_section()
# 结果显示区域
self._create_result_section()
# 图片显示区域
self.image_label = ttk.Label(self.main_frame)
self.image_label.grid(row=2, column=0, columnspan=6, pady=20)
def _create_input_section(self):
"""创建输入区域组件"""
ttk.Label(self.main_frame, text="请输入您的生日:").grid(row=0, column=0, pady=10)
# 月份输入
self.month_var = tk.StringVar()
ttk.Label(self.main_frame, text="月:").grid(row=0, column=1)
self.month_entry = ttk.Entry(self.main_frame, textvariable=self.month_var, width=5)
self.month_entry.grid(row=0, column=2, padx=5)
# 日期输入
self.day_var = tk.StringVar()
ttk.Label(self.main_frame, text="日:").grid(row=0, column=3)
self.day_entry = ttk.Entry(self.main_frame, textvariable=self.day_var, width=5)
self.day_entry.grid(row=0, column=4, padx=5)
# 查询按钮
ttk.Button(self.main_frame, text="查询", command=self.check_zodiac).grid(row=0, column=5, padx=10)
def _create_result_section(self):
"""创建结果显示区域"""
self.result_frame = ttk.LabelFrame(self.main_frame, text="星座信息", padding="10")
self.result_frame.grid(row=1, column=0, columnspan=6, pady=20, sticky=(tk.W, tk.E))
# 星座名称标签
self.zodiac_label = ttk.Label(self.result_frame, text="")
self.zodiac_label.grid(row=0, column=0, pady=5)
# 日期范围标签
self.date_label = ttk.Label(self.result_frame, text="")
self.date_label.grid(row=1, column=0, pady=5)
# 特点描述标签(支持自动换行)
self.traits_label = ttk.Label(self.result_frame, text="", wraplength=400)
self.traits_label.grid(row=2, column=0, pady=5)
def check_zodiac(self):
"""处理查询按钮点击事件"""
try:
# 获取并验证输入
month = int(self.month_var.get())
day = int(self.day_var.get())
# 星座判断逻辑
zodiac = self._determine_zodiac(month, day)
# 更新显示结果
self._update_display(zodiac)
# 加载并显示星座图片
self._load_zodiac_image(zodiac)
except ValueError:
self.zodiac_label.config(text="请输入有效的日期!")
def _determine_zodiac(self, month, day):
"""根据月份和日期判断星座"""
# 使用嵌套条件判断确定星座
if (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 "射手座"
elif (month == 12 and day >= 22) or (month == 1 and day <= 19):
return "摩羯座"
elif (month == 1 and day >= 20) or (month == 2 and day <= 18):
return "水瓶座"
else:
return "双鱼座"
def _update_display(self, zodiac):
"""更新结果区域的显示内容"""
info = self.zodiac_info[zodiac]
self.zodiac_label.config(text=f"您的星座是:{zodiac}")
self.date_label.config(text=f"日期范围:{info['日期']}")
self.traits_label.config(text=f"星座特点:{info['特点']}")
def _load_zodiac_image(self, zodiac):
"""加载并显示星座图片"""
try:
# 构建图片路径(假设图片存放在zodiac_images目录下)
image_path = os.path.join("zodiac_images", self.zodiac_info[zodiac]['图片'])
# 打开并调整图片大小
image = Image.open(image_path).resize((200, 200), Image.Resampling.LANCZOS)
photo = ImageTk.PhotoImage(image)
# 更新图片显示
self.image_label.config(image=photo)
self.image_label.image = photo # 保持图片引用防止被垃圾回收
except Exception as e:
self.image_label.config(text="图片加载失败")
print(f"图片加载错误:{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = ZodiacApp(root)
root.mainloop() # 启动GUI主循环
三、注意事项
1. 需要创建zodiac_images目录并放置对应的星座图片文件
2. 图片文件名需要与代码中的定义完全一致
3. 建议使用绝对路径或正确配置相对路径来确保图片加载正常