当前位置: 首页 > article >正文

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. 建议使用绝对路径或正确配置相对路径来确保图片加载正常

 


http://www.kler.cn/a/576858.html

相关文章:

  • ARMV8的64位指令
  • cdn取消接口缓存
  • Redis 各数据类型使用场景详解
  • Scaling Laws for Neural Language Models
  • DIY Tomcat:手写一个简易Servlet容器
  • HTTPS安全通信协议原理
  • 什么是 Java 的 Timer?
  • opentitan riscv
  • 关于父组件向子组件传值的形式(类型一)
  • 【商城实战(13)】购物车价格与数量的奥秘
  • 【leetcode hot 100 142】环形链表Ⅱ
  • webflux响应式编程
  • Windows、macOS和Linux系统的统计文件夹下的文件数量的方法
  • 笔记:代码随想录算法训练营day38: LeetCode322. 零钱兑换、279.完全平方数、139.单词拆分;多重背包
  • 数学建模:MATLAB强化学习
  • MacBook上API调⽤⼯具推荐
  • 线性代数笔记28--奇异值分解(SVD)
  • 【从零开始学习计算机科学】数字逻辑(五) Verilog HDL语言
  • Lab17_ Blind SQL injection with out-of-band data exfiltration
  • MTK Android12 桌面上显示文件管理器图标