用Python和Tkinter创作正月十五元宵节庆祝代码

用Python和Tkinter创作正月十五元宵节庆祝代码

每年农历正月十五是中国传统的元宵佳节,中国的传统节日,在这个夜晚,人们要点起彩灯,出门赏月赏灯、喜猜灯谜、共吃元宵等,以示庆贺。用Python和Tkinter创作正月十五元宵节庆祝代码,界面元素:

花灯部/灯笼动态摆动。

谜语条幅部分,用户可能希望有一个区域显示灯谜,并且可以切换不同的谜语。

整个界面以红色为背景,充满节日气氛,底部有控制按钮可切换谜语和显示答案:

“下一个谜语”按钮切换题目

“显示答案”按钮揭晓谜底

运行效果:

源码如下:

import tkinter as tk
import random
from math import sin, radians

class LanternFestivalApp:
    def __init__(self, root):
        self.root = root
        self.root.title("元宵节快乐!")
        self.root.configure(bg="#FF4500")
        
        # 创建画布和基础元素
        self.canvas = tk.Canvas(root, width=800, height=600, bg="#FF4500", highlightthickness=0)
        self.canvas.pack()

        # 初始化灯笼和谜语数据:("谜面","谜底")
        self.lanterns = []
        self.riddles = [
            ("团结劳动巧分工,白花丛中忙中停,家中开着蜜糖店,人人拍手齐赞成(打一动物)","蜜蜂"),
            ("大有头,中无心,小全身(打一字)","京"),
            ("白胖娃娃泥里藏,腰身细细心眼多(打一蔬菜)", "藕"),
            ("明明亮亮,又平又光,谁来看它,跟谁一样(打一物品)", "镜子"),
            ("小时胖乎乎,老来皮肉皱(打一水果)", "葡萄"),
            ("红口袋,绿口袋,有人怕,有人爱(打一蔬菜)", "辣椒"),
            ("家家户户挂花灯,汤圆香味扑鼻来。满街人儿如潮水,明月挂上青云稍(打一节日)","元宵节")
        ]
        self.current_riddle = 0

        # 创建界面元素
        self.create_festival_elements()
        self.create_control_buttons()
        self.animate_lanterns()

    def create_festival_elements(self):
        """创建节日元素"""
        # 灯笼组
        colors = ["#FF3300", "#FF6600", "#FF9900"]
        for _ in range(5):
            x = random.randint(100, 700)
            y = random.randint(50, 200)
            self.create_lantern(x, y, colors[_%3])

        # 谜语条幅(加大尺寸)
        self.riddle_banner = self.canvas.create_rectangle(
            150, 350, 650, 550,  # 加大垂直空间
            fill="#FFFF00", outline="#FF0000", width=3
        )
        # 带自动换行的文本
        self.riddle_text = self.canvas.create_text(
            400, 450, 
            text=self.riddles[0][0], 
            font=("楷体", 18, "bold"), 
            fill="#FF0000",
            width=400,  # 设置换行宽度
            justify="center"  # 居中显示
        )

        # 节日标题
        self.canvas.create_text(
            400, 60,
            text="元宵喜乐会",
            font=("华文行楷", 36, "bold"),
            fill="gold"
        )

    def create_lantern(self, x, y, color):
        """创建单个灯笼并存储所有组件"""
        parts = []
        
        # 灯笼主体
        body = self.canvas.create_oval(
            x-30, y-50, x+30, y+50,
            fill=color, outline="gold", width=2
        )
        parts.append(body)
        
        # 顶部装饰
        top = self.canvas.create_rectangle(
            x-15, y-60, x+15, y-50,
            fill="gold", outline=""
        )
        parts.append(top)
        
        # 底部装饰
        bottom = self.canvas.create_rectangle(
            x-15, y+50, x+15, y+60,
            fill="gold", outline=""
        )
        parts.append(bottom)
        
        # 灯笼穗子
        for i in range(-20, 21, 5):
            tassel = self.canvas.create_line(
                x+i, y+60, x+i, y+80,
                fill="gold", width=2
            )
            parts.append(tassel)
        
        self.lanterns.append({
            "parts": parts,
            "angle": 0,
            "speed": random.uniform(0.5, 1.5)
        })

    def create_control_buttons(self):
        """创建控制按钮"""
        btn_frame = tk.Frame(self.root, bg="#FF4500")
        btn_frame.pack(pady=10)
        
        tk.Button(
            btn_frame, text="下一个谜语", 
            font=("宋体", 12, "bold"),
            command=self.next_riddle,
            bg="#FFD700", fg="#8B0000",
            relief="ridge", padx=10
        ).pack(side=tk.LEFT, padx=20)
        
        tk.Button(
            btn_frame, text="显示答案", 
            font=("宋体", 12, "bold"),
            command=self.show_answer,
            bg="#FFD700", fg="#8B0000",
            relief="ridge", padx=10
        ).pack(side=tk.LEFT, padx=20)

    def animate_lanterns(self):
        """灯笼动画效果"""
        for lantern in self.lanterns:
            dx = 5 * sin(radians(lantern["angle"]))
            for part in lantern["parts"]:
                self.canvas.move(part, dx, 0)
            lantern["angle"] += lantern["speed"]
        self.root.after(50, self.animate_lanterns)

    def next_riddle(self):
        """切换谜语时自动调整布局"""
        self.current_riddle = (self.current_riddle + 1) % len(self.riddles)
        # 更新文本内容
        self.canvas.itemconfig(
            self.riddle_text, 
            text=self.riddles[self.current_riddle][0]
        )
        # 自动调整条幅高度
        self.adjust_banner_height()

    def adjust_banner_height(self):
        """根据文本行数自动调整条幅高度"""
        # 获取文本的边界框
        bbox = self.canvas.bbox(self.riddle_text)
        text_height = bbox[3] - bbox[1]
        
        # 计算新高度(基础高度+额外余量)
        new_height = 350 + text_height + 40  # 原始Y坐标350,增加文本高度和余量
        
        # 更新条幅形状
        self.canvas.coords(
            self.riddle_banner,
            150, 350, 650, new_height
        )
        # 重新居中文本
        self.canvas.coords(
            self.riddle_text,
            400, (350 + new_height)/2
        )

    def show_answer(self):
        """显示答案(带自动换行)"""
        question = self.riddles[self.current_riddle][0]
        answer = self.riddles[self.current_riddle][1]
        display_text = f"谜面:{question}\n\n谜底:{answer}"
        
        self.canvas.itemconfig(
            self.riddle_text, 
            text=display_text
        )
        self.adjust_banner_height()

if __name__ == "__main__":
    root = tk.Tk()
    app = LanternFestivalApp(root)
    
    # 添加节日祝福
    tk.Label(
        root, text="阖家团圆庆元宵", 
        font=("华文琥珀", 24), 
        fg="#FFD700", bg="#FF4500"
    ).pack(pady=10)
    
    root.mainloop()

你可能感兴趣的:(python,开发语言)