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

端午安康(Python)

 端午节总算是回家了,感觉时间过得真快,马上就毕业了,用Python弄了一个端午节元素的界面,虽然有点不像,祝大家端午安康。端午节粽子(python)_python画粽子-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/131338766?spm=1001.2014.3001.5502

import tkinter as tk
from tkinter import messagebox, Canvas
import random
import math# 端午节祝福语库
blessings = ["粽叶飘香五月五,浓情端午送祝福\n愿你生活如粽甜,幸福美满永安康!","艾叶香,麦浪黄,人间美景是端阳\n愿您事业龙舟竞渡,生活粽享幸福!","五色丝线系吉祥,一枚香囊保安康\n祝您端午时节诸事顺,美好生活万年长!","龙舟破浪勇向前,糯米粘粘情相连\n愿您前程似锦赛龙舟,好运连连粽相伴!","青青粽叶盈,赤赤枣香浓\n愿您端午安康,幸福永长!","彩线轻缠红玉臂,小符斜挂绿云鬟\n祝您端午吉祥,万事如意!"
]
# 全局常量
SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 700
paddle_angle = 0class DragonBoat:def __init__(self, canvas):self.canvas = canvasself.SCREEN_WIDTH = SCREEN_WIDTHself.SCREEN_HEIGHT = SCREEN_HEIGHTself.x = -200self.y = SCREEN_HEIGHT * 0.7self.speed = max(1.0, SCREEN_WIDTH / 400)self.parts = []# 新增划手动画所需变量self.paddles = []  # 存储桨线段对象self.paddle_blades = []  # ✅ 添加这一行:存储桨叶对象self.paddle_angles = []  # 每个桨的角度self.paddle_angle_speeds = []  # 每个桨的摆动速度# 新增龙须变量self.beards = []  # 存储龙须线段对象self.beard_angles = []  # 每根龙须的角度偏移self.beard_oscillation_speed = 0.03  # 降低摆动速度self.beard_oscillation_amplitude = 2  # 减小摆动幅度self.create_boat()def create_boat(self):# 船体boat_size = max(30.0, self.SCREEN_WIDTH / 20.0)  # 根据屏幕大小调整船体尺寸hull = self.canvas.create_polygon(self.x, self.y,self.x - boat_size * 3, self.y + boat_size,self.x - boat_size * 2, self.y + boat_size * 2,self.x + boat_size * 2, self.y + boat_size * 2,self.x + boat_size * 3, self.y + boat_size,self.x, self.y,fill="#CD5C5C", outline="black", width=2, smooth=True)self.parts.append(hull)# 龙头head = self.canvas.create_polygon(self.x + boat_size * 3, self.y + boat_size,self.x + boat_size * 4, self.y + boat_size * 0.5,self.x + boat_size * 4.5, self.y + boat_size * 0.75,self.x + boat_size * 4.25, self.y + boat_size * 1.25,self.x + boat_size * 4, self.y + boat_size * 1.75,self.x + boat_size * 3.5, self.y + boat_size * 1.75,self.x + boat_size * 3, self.y + boat_size,fill="#8B0000", outline="black", width=2, smooth=True)self.parts.append(head)# 龙眼eye_size = max(2.0, boat_size / 10)eye = self.canvas.create_oval(self.x + boat_size * 4.1, self.y + boat_size * 0.875,self.x + boat_size * 4.25, self.y + boat_size,fill="white", outline="black")self.parts.append(eye)pupil = self.canvas.create_oval(self.x + boat_size * 4.13, self.y + boat_size * 0.9,self.x + boat_size * 4.17, self.y + boat_size * 0.95,fill="black")self.parts.append(pupil)# 龙角horn1 = self.canvas.create_polygon(self.x + boat_size * 4.25, self.y + boat_size * 0.75,self.x + boat_size * 4.375, self.y + boat_size * 0.375,self.x + boat_size * 4.5, self.y + boat_size * 0.5,self.x + boat_size * 4.25, self.y + boat_size * 0.75,fill="#8B4513", outline="black")horn2 = self.canvas.create_polygon(self.x + boat_size * 4, self.y + boat_size * 0.5,self.x + boat_size * 4.125, self.y + boat_size * 0.25,self.x + boat_size * 4.25, self.y + boat_size * 0.375,self.x + boat_size * 4, self.y + boat_size * 0.5,fill="#8B4513", outline="black")self.parts.extend([horn1, horn2])# 龙须beard1 = self.canvas.create_line(self.x + boat_size * 3.9, self.y + boat_size * 1.1,self.x + boat_size * 3.95, self.y + boat_size * 1.05,  # 缩短距离self.x + boat_size * 4.0, self.y + boat_size * 0.95,fill="gold", width=2, smooth=False)beard2 = self.canvas.create_line(self.x + boat_size * 3.9, self.y + boat_size * 1.3,self.x + boat_size * 3.95, self.y + boat_size * 1.35,self.x + boat_size * 4.0, self.y + boat_size * 1.4,fill="gold", width=2, smooth=False)self.parts.extend([beard1, beard2])self.beards.extend([beard1, beard2])# 初始化龙须摆动角度for _ in range(len(self.beards)):self.beard_angles.append(random.uniform(0, math.pi * 2))# 划桨手num_rowers = max(3, int(SCREEN_HEIGHT / 200))  # 根据屏幕宽度调整划手数量for i in range(num_rowers):rower_x = self.x - boat_size * 2 + i * (boat_size * 1.5)# 身体位置 - 在船体内部body_y = self.y + boat_size * 0.8  # 降低身体位置# 身体body = self.canvas.create_oval(rower_x, body_y,rower_x + boat_size * 0.375, body_y + boat_size * 0.5,fill="#FFD700")# 头部head = self.canvas.create_oval(rower_x + boat_size * 0.075, body_y - boat_size * 0.4,rower_x + boat_size * 0.3, body_y,fill="#FFDEAD")# 桨 - 修复位置问题# 桨柄位置在划手身体中间paddle_x = rower_x + boat_size * 0.1875paddle_y = body_y + boat_size * 0.25# 桨长度paddle_length = boat_size * random.uniform(1.5, 2.5)angle_deg = 30 + math.sin(paddle_angle) * 10  # 动态角度# 桨的角度 - 稍微向下倾斜paddle_end_x = paddle_x + paddle_length * math.cos(math.radians(angle_deg))paddle_end_y = paddle_y + paddle_length * math.sin(math.radians(angle_deg))# 绘制船桨paddle = self.canvas.create_line(paddle_x, paddle_y,paddle_end_x, paddle_end_y,fill="#8B4513", width=3)# 绘制桨叶paddle_blade = self.canvas.create_polygon(paddle_end_x, paddle_end_y,paddle_end_x + boat_size * 0.2, paddle_end_y + boat_size * 0.1,paddle_end_x + boat_size * 0.2, paddle_end_y - boat_size * 0.1,paddle_end_x, paddle_end_y,fill="#8B4513", outline="black")self.parts.extend([body, head, paddle, paddle_blade])# 在创建桨后保存引用self.paddles.append(paddle)  # paddle 是 line 对象self.paddle_blades.append(paddle_blade)  # 这是关键!self.paddle_angles.append(random.uniform(0, math.pi * 2))  # 初始角度self.paddle_angle_speeds.append(random.uniform(0.05, 0.1))  # 摆动速度def move(self):for item in self.parts:self.canvas.move(item, self.speed, 0)self.x += self.speedif self.x > self.SCREEN_WIDTH + 200:self.reset_position()return# 更新每个桨的角度for i in range(len(self.paddles)):try:self.paddle_angles[i] += self.paddle_angle_speeds[i]# 获取桨起点coords = self.canvas.coords(self.paddles[i])if not coords:continuepaddle_x, paddle_y = coords[0], coords[1]# 计算新终点angle_deg = 30 + math.sin(self.paddle_angles[i]) * 15paddle_length = 60  # 固定长度或根据 boat_size 调整paddle_end_x = paddle_x + paddle_length * math.cos(math.radians(angle_deg))paddle_end_y = paddle_y + paddle_length * math.sin(math.radians(angle_deg))# 更新桨线段self.canvas.coords(self.paddles[i],paddle_x, paddle_y,paddle_end_x, paddle_end_y)# 更新桨叶(如果存在)if i < len(self.paddle_blades) and self.paddle_blades[i]:self.canvas.coords(self.paddle_blades[i],paddle_end_x, paddle_end_y,paddle_end_x + 10, paddle_end_y + 5,paddle_end_x + 10, paddle_end_y - 5,paddle_end_x, paddle_end_y)except IndexError:continue  # 忽略越界索引# ✅ 更新龙须的摆动动画global paddle_anglefor i in range(len(self.beards)):coords = self.canvas.coords(self.beards[i])if not coords or len(coords) < 6:  # 确保有3个点(6个坐标)continuex1, y1, mid_x, mid_y, x2, y2 = coords# ✅ 使用全局 paddle_angle 控制龙须摆动# 计算端点摆动end_offset = math.sin(paddle_angle + i * 0.5) * self.beard_oscillation_amplitudenew_x2 = x2 + end_offset * 0.5new_y2 = y2 + end_offset * 0.5# 对中间点增加小幅摆动mid_offset = math.sin(paddle_angle + i * 0.5) * self.beard_oscillation_amplitude * 0.3new_mid_x = mid_x + mid_offset * 0.2new_mid_y = mid_y + mid_offset * 0.2# 更新三个点坐标(形成折线)self.canvas.coords(self.beards[i],x1, y1,new_mid_x, new_mid_y,  # 中间点坐标new_x2, new_y2)def reset_position(self):for item in self.parts:self.canvas.delete(item)self.parts = []self.x = -200self.y = self.SCREEN_HEIGHT * 0.7self.speed = max(1.0, self.SCREEN_WIDTH / 400)self.create_boat()class FloatingZongzi:def __init__(self, canvas):self.canvas = canvasself.SCREEN_WIDTH = SCREEN_WIDTHself.SCREEN_HEIGHT = SCREEN_HEIGHT# 确保使用整数参数min_y = int(SCREEN_HEIGHT * 0.7)max_y = int(SCREEN_HEIGHT - 50)self.x = random.randint(50, SCREEN_WIDTH - 50)self.y = random.randint(min_y, max_y) if min_y < max_y else min_yself.size = random.randint(max(10, int(SCREEN_WIDTH / 80)),max(20, int(SCREEN_WIDTH / 40)))self.speed = random.uniform(0.3, 1.0)self.direction = random.choice([-1, 1])self.zongzi = self.create_zongzi()def create_zongzi(self):# 粽体body = self.canvas.create_polygon(self.x, self.y,self.x - self.size / 2, self.y + self.size,self.x + self.size / 2, self.y + self.size,self.x, self.y,fill="#3CB371", outline="black", width=1, smooth=True)# 粽叶纹理for i in range(3):y_offset = self.y + (i + 1) * self.size / 4line = self.canvas.create_line(self.x - self.size / 2 + 5, y_offset,self.x + self.size / 2 - 5, y_offset,fill="#2E8B57", width=1)# 绑绳rope_y = self.y + self.size * 0.7rope = self.canvas.create_line(self.x - self.size / 2, rope_y,self.x + self.size / 2, rope_y,fill="#8B4513", width=2)return [body, rope]def move(self):self.y -= self.speedself.x += self.speed * self.direction * 0.3for item in self.zongzi:self.canvas.move(item, self.speed * self.direction * 0.3, -self.speed)# 如果飘出屏幕,重置位置if self.y < -50:self.reset_position()def reset_position(self):for item in self.zongzi:self.canvas.delete(item)self.x = random.randint(50, self.SCREEN_WIDTH - 50)self.y = self.SCREEN_HEIGHT + 50self.zongzi = self.create_zongzi()def show_blessing():"""显示随机祝福"""blessing = random.choice(blessings)messagebox.showinfo("端午安康", blessing)def create_background(canvas):"""创建自适应背景"""# 清除现有背景canvas.delete("background")# 渐变天空for i in range(int(SCREEN_HEIGHT * 0.7)):y = iblue_value = max(100.0, 235 - i * 0.7)color = f"#87CE{int(blue_value):02X}"canvas.create_line(0, y, SCREEN_WIDTH, y, fill=color, width=1, tags="background")# 水面canvas.create_rectangle(0, SCREEN_HEIGHT * 0.7,SCREEN_WIDTH, SCREEN_HEIGHT,fill="#1E90FF", outline="", tags="background")# 远山num_mountains = max(3, int(SCREEN_WIDTH / 200))for i in range(num_mountains):x_start = i * (SCREEN_WIDTH / num_mountains) - 100height = random.randint(int(SCREEN_HEIGHT * 0.1), int(SCREEN_HEIGHT * 0.2))points = [x_start, SCREEN_HEIGHT * 0.7]segments = 5for j in range(segments):points.extend([x_start + j * (SCREEN_WIDTH / num_mountains / segments),SCREEN_HEIGHT * 0.7 - random.randint(20, height)])points.extend([x_start + SCREEN_WIDTH / num_mountains, SCREEN_HEIGHT * 0.7])canvas.create_polygon(points, fill="#228B22", outline="#006400", smooth=True, tags="background")# 水波纹wave_height = min(10.0, SCREEN_HEIGHT * 0.02)for i in range(int(SCREEN_HEIGHT * 0.3 / 10)):y = SCREEN_HEIGHT * 0.7 + i * 10for j in range(int(SCREEN_WIDTH / 40)):x_start = j * 40canvas.create_arc(x_start, y,x_start + 40, y + wave_height * 2,start=180, extent=-180,outline="#87CEEB", width=1, tags="background")def create_title(canvas):"""创建自适应标题"""canvas.delete("title")canvas.create_text(SCREEN_WIDTH / 2, SCREEN_HEIGHT * 0.15,text="端午节安康",font=("楷体", 36, "bold"),fill="#B22222",activefill="#FF4500",tags="title")# 装饰花纹for i in range(8):angle = i * math.pi / 4radius = min(150.0, SCREEN_WIDTH / 8)x = SCREEN_WIDTH / 2 + radius * math.cos(angle)y = SCREEN_HEIGHT * 0.15 + radius * math.sin(angle)canvas.create_line(SCREEN_WIDTH / 2, SCREEN_HEIGHT * 0.15, x, y, fill="gold", width=2, dash=(4, 4),tags="title")# 装饰粽子size = max(10.0, min(20.0, SCREEN_WIDTH / 60))zongzi = canvas.create_polygon(x, y,x - size / 2, y + size,x + size / 2, y + size,x, y,fill="#3CB371", outline="black", width=1, tags="title")# 装饰艾草if i % 2 == 0:canvas.create_line(x, y, x, y - size * 2, fill="#228B22", width=3, tags="title")canvas.create_line(x, y - size * 2, x - size, y - size * 3, fill="#228B22", width=2, tags="title")canvas.create_line(x, y - size * 2, x + size, y - size * 3, fill="#228B22", width=2, tags="title")def create_button(canvas):"""创建自适应按钮"""canvas.delete("button")button_width = 100button_height = 50button_x = SCREEN_WIDTH / 2 - button_width / 2button_y = SCREEN_HEIGHT * 0.85button_bg = canvas.create_rectangle(button_x, button_y,button_x + button_width, button_y + button_height,fill="#FFD700", outline="#8B0000", width=2, tags="button")button_text = canvas.create_text(SCREEN_WIDTH / 2, button_y + button_height / 2,text="端午祝福",font=("微软雅黑", 18, "bold"),fill="#8B0000",tags="button")# 绑定事件canvas.tag_bind(button_bg, "<Button-1>", lambda e: show_blessing())canvas.tag_bind(button_text, "<Button-1>", lambda e: show_blessing())# 添加悬停效果def on_enter(e):canvas.itemconfig(button_bg, fill="#FFA500")def on_leave(e):canvas.itemconfig(button_bg, fill="#FFD700")canvas.tag_bind(button_bg, "<Enter>", on_enter)canvas.tag_bind(button_bg, "<Leave>", on_leave)canvas.tag_bind(button_text, "<Enter>", on_enter)canvas.tag_bind(button_text, "<Leave>", on_leave)def center_window(root):"""将窗口置于屏幕中央"""root.update_idletasks()screen_width = root.winfo_screenwidth()screen_height = root.winfo_screenheight()x = (screen_width - SCREEN_WIDTH) // 2y = (screen_height - SCREEN_HEIGHT) // 4root.geometry(f"{SCREEN_WIDTH}x{SCREEN_HEIGHT}+{x}+{y}")def animate():"""动画循环"""global paddle_angledragon_boat.move()for zongzi in floating_zongzis:zongzi.move()paddle_angle += 0.1  # 控制摆动速度root.after(30, animate)# 创建主窗口
root = tk.Tk()
root.title("端午安康")
root.configure(bg="#F0F8FF")
root.resizable(False, False)# 创建画布
canvas = Canvas(root, width=SCREEN_WIDTH, height=SCREEN_HEIGHT, bg="white", highlightthickness=0)
canvas.pack()# 初始化元素
create_background(canvas)
create_title(canvas)
create_button(canvas)# 初始化动画元素
dragon_boat = DragonBoat(canvas)
floating_zongzis = [FloatingZongzi(canvas) for _ in range(10)]# 窗口居中
center_window(root)# 开始动画
animate()root.mainloop()

相关文章:

  • 现代数据湖架构全景解析:存储、表格式、计算引擎与元数据服务的协同生态
  • 【Web API系列】WebTransportSendStream接口深度解析:构建高性能实时数据传输的基石
  • 开源是什么?我们为什么要开源?
  • 谷歌工作自动化——仙盟大衍灵机——仙盟创梦IDE
  • Java中的引用类型以及区别的特点
  • 第十四章 MQTT订阅
  • 【数据结构】字符串操作整理(C++)
  • MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
  • Spring Cache核心原理与快速入门指南
  • Python趣学篇:交互式词云生成器(jieba + Tkinter + WordCloud等)
  • day61—DFS—省份数量(LeetCode-547)
  • 27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践
  • 前端八股HTTP和https大全套
  • Socket编程之TCP套件字
  • 【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
  • 【Hot 100】55. 跳跃游戏
  • 如何获得Python的requirement.txt
  • C#数字金额转中文大写金额:代码解析
  • 流媒体基础解析:从压缩到传输的基本了解
  • springMVC-9数据格式化
  • 哪里有做网站培训的/厦门网站优化
  • 福田瑞沃轻卡/开源seo软件
  • 公安网站备案到底需要什么/seo项目优化案例分析文档
  • 网站开发教程pdf/业务多平台怎么样
  • flask做视频网站/个人博客网站设计毕业论文
  • 西宁电子商务网站建设/广州seo顾问