每年农历正月十五是中国传统的元宵佳节,中国的传统节日,在这个夜晚,人们要点起彩灯,出门赏月赏灯、喜猜灯谜、共吃元宵等,以示庆贺。用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()