【python】python爱心代码【附源码】
一、实现效果:
欢迎来到英杰社区https://bbs.csdn.net/topics/617804998
二、完整代码:
import math
import random
import threading
import time
from math import sin, cos, pi, log
from tkinter import *
import re# 烟花相关设置
Fireworks = []
maxFireworks = 8
CANVAS_WIDTH = 1080 # 画布的宽
CANVAS_HEIGHT = 600 # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2 # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 # 画布中心的Y轴坐标
IMAGE_ENLARGE = 12 # 放大比例
HEART_COLOR = "pink" # 心的颜色# 烟花类
class firework(object):def __init__(self, color, speed, width, height):self.radius = random.randint(2, 3) # 粒子半径为2~3像素self.color = color # 粒子颜色self.speed = speed # speed是1.5-3.5秒self.status = 0 # 在烟花未爆炸的情况下,status=0;爆炸后,status>=1;当status>100时,烟花的生命期终止self.nParticle = random.randint(80, 100) # 粒子数量self.center = [random.randint(0, width - 15), random.randint(0, height - 15)] # 烟花随机中心坐标self.oneParticle = [] # 原始粒子坐标(100%状态时)self.rotTheta = random.uniform(-1, 2 * math.pi) # 椭圆平面旋转角self.ellipsePara = [random.randint(30, 40), random.randint(20, 30)] # 椭圆参数方程:x=a*cos(theta),y=b*sin(theta)theta = 2 * math.pi / self.nParticlefor i in range(self.nParticle):t = random.uniform(-1.0 / 16, 1.0 / 16) # 产生一个 [-1/16,1/16) 的随机数x, y = self.ellipsePara[0] * math.cos(theta * i + t), self.ellipsePara[1] * math.sin(theta * i + t) # 椭圆参数方程xx, yy = x * math.cos(self.rotTheta) - y * math.sin(self.rotTheta), y * math.cos(self.rotTheta) + x * math.sin(self.rotTheta) # 平面旋转方程self.oneParticle.append([xx, yy])self.curParticle = self.oneParticle[0:] # 当前粒子坐标self.thread = threading.Thread(target=self.extend) # 建立线程对象
完整代码,见文末
三、准备工作
(1)、导入必要的模块:
代码首先导入了需要使用的模块:requests、lxml和csv。
import requests
from lxml import etree
import csv
如果出现模块报错
进入控制台输入:建议使用国内镜像源
pip install 模块名称 -i https://mirrors.aliyun.com/pypi/simple
我大致罗列了以下几种国内镜像源:
清华大学
https://pypi.tuna.tsinghua.edu.cn/simple阿里云
https://mirrors.aliyun.com/pypi/simple/豆瓣
https://pypi.douban.com/simple/ 百度云
https://mirror.baidu.com/pypi/simple/中科大
https://pypi.mirrors.ustc.edu.cn/simple/华为云
https://mirrors.huaweicloud.com/repository/pypi/simple/腾讯云
https://mirrors.cloud.tencent.com/pypi/simple/
firework
类
class firework:def __init__(self, x, y, color):self.x = xself.y = yself.color = colorself.radius = 1self.speed = random.uniform(0.5, 1.5)self.angle = math.radians(random.randint(0, 360))self.vx = self.speed * math.cos(self.angle)self.vy = self.speed * math.sin(self.angle)self.age = 0self.alive = Trueself.particles = []
这个类表示了一个烟花对象,它有以下属性:
x
和y
:当前烟花的坐标。
color
:当前烟花的颜色。
radius
:当前烟花的半径。
speed
:当前烟花的速度。
angle
:当前烟花的运动角度。
vx
和vy
:当前烟花的速度在 x 和 y 方向上的分量。
age
:当前烟花已经存在的时间。
alive
:当前烟花是否还存活。
particles
:当前烟花爆炸后生成的粒子列表。
colorChange
函数
def colorChange(color, age):r, g, b = colorif age > 255:age = 255if age <= 85:return (r+age, g, b)elif age <= 170:return (r, g+age-85, b)else:return (r, g, b+age-170)
这个函数用于计算烟花的颜色,它接受两个参数:
-
color
:当前烟花的颜色。 -
age
:当前烟花已经存在的时间。
根据 age
的值,逐渐改变颜色的 R、G、B 分量来实现颜色的渐变效果。具体来说,如果 age
小于等于 85,则只改变红色分量,否则如果 age
小于等于 170,则同时改变红色和绿色分量,否则同时改变红色、绿色和蓝色分量。
appendFirework
函数
def appendFirework():f = firework(random.randint(100, w-100), h, (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))fireworks.append(f)root.after(random.randint(100, 1000), appendFirework)
这个函数用于递归生成烟花对象,并在画布上显示烟花效果。具体来说,它做了以下几件事情:
-
创建一个新的
firework
对象,随机指定其坐标、颜色、速度和角度等属性。 -
将新的烟花对象添加到
fireworks
列表中。 -
随机生成 100 到 1000 毫秒的时间,之后再次调用
appendFirework
函数,实现递归生成烟花对象。
heart_function
函数
def heart_function(theta):x = 16 * math.sin(theta) ** 3y = 13 * math.cos(theta) - 5 * math.cos(2*theta) - 2 * math.cos(3*theta) - math.cos(4*theta)return (x, -y)
这个函数用于计算心形图案上的点坐标,它接受一个参数 theta
,表示当前点所在的极角。具体来说,它使用一组极坐标方程来计算出心形图案上的点坐标,然后将其转换为笛卡尔坐标系下的坐标值并返回。
scatter_inside
函数
def scatter_inside(p, speed):x, y = p.posvx, vy = p.veldist = math.hypot(x, y)if dist < 1:dist = 1dx = x / distdy = y / distforce = (10 / (dist ** 2)) * speeddvx = force * dxdvy = force * dyp.vel = (vx+dvx, vy+dvy)
这个函数用于实现心形内部的扩散效果,它接受两个参数:
-
p
:当前粒子对象。 -
speed
:扩散速度。
首先根据当前粒子的位置计算出一个向心力,然后根据该力的大小和方向改变粒子的速度,从而实现向外扩散的效果。
shrink
函数
def shrink(p, speed):x, y = p.posvx, vy = p.veldist = math.hypot(x, y)if dist < 1:dist = 1dx = x / distdy = y / distforce = (-10 / (dist ** 2)) * speeddvx = force * dxdvy = force * dyp.vel = (vx+dvx, vy+dvy)
这个函数用于实现心形收缩效果,它接受两个参数:
-
p
:当前粒子对象。 -
speed
:收缩速度。
与 scatter_inside
函数类似,这个函数也是根据当前粒子的位置计算出一个向心力,然后根据该力的大小和方向改变粒子的速度,从而实现向内收缩的效果。
curve
函数
def curve(t):if t < 1:return math.sin(t*math.pi/2)else:return math.sin((2-t)*math.pi/2) * 0.5 + 0.5
这个函数返回一个介于 0 和 4 之间的值,用于控制心形动画的曲线效果。具体来说,它接受一个参数 t
,表示当前时间占总动画时间的比例,然后根据 t
的值返回一个介于 0 和 4 之间的值,用于控制心形动画的曲线效果。
Heart
类
class Heart:def __init__(self):self.points = []self.colors = []self.particles = []self.speed = 5self.pos = (w/2, h/2)self.rotation = 0self.scale = 1self._create_heart()
def _create_heart(self):for i in range(1000):theta = i / 1000 * math.pi * 2r = heart_function(theta)[0]x = r * math.cos(theta)y = r * math.sin(theta)self.points.append((x, y))self.colors.append((random.randint(128, 255), random.randint(0, 128), random.randint(0, 128)))
def update(self):for p in self.particles:p.update()self.particles = [p for p in self.particles if p.alive]
if random.random() < 0.3:x, y = self.posdx = random.uniform(-1, 1) * self.speeddy = random.uniform(-1, 1) * self.speedp = Particle((x+dx, y+dy), (dx/4, dy/4))self.particles.append(p)
self.rotation += 0.001self.scale = curve(self.rotation)
def draw(self, canvas):cx, cy = self.posfor i, (x, y) in enumerate(self.points):r, g, b = self.colors[i]
x *= self.scaley *= self.scale
x, y = rotate(x, y, self.rotation)
x += cxy += cy
canvas.create_oval(x-1, y-1, x+1, y+1, fill="#%02x%02x%02x" % (r, g, b), width=0)
这个类用于生成爱心图案及其动态效果,它有以下属性:
points
:存储心形图案上的所有点的坐标。
colors
:存储心形图案上的所有点的颜色。
particles
:存储所有心形收缩和扩散过程中生成的粒子。
speed
:控制粒子运动速度的参数。
pos
:控制心形图案位置的参数。
rotation
:控制心形图案旋转角度的参数。
scale
:控制心形图案缩放比例的参数。
其中,初始化函数 _create_heart
用于生成心形图案上的所有点和颜色,update
函数用于更新心形图案的动画效果,draw
函数用于在画布上绘制心形图案,并在每一帧更新心形的动态效果。
draw
函数
def draw():global fireworks, heartscanvas.delete("all")for f in fireworks:if f.alive:f.draw(canvas)f.update()else:for p in f.particles:if random.random() < 0.5:hearts.append(Heart())fireworks.remove(f)for h in hearts:h.draw(canvas)h.update()root.after(25, draw)
这个函数用于在画布上绘制烟花和心形图案,并在每一帧更新它们的动画效果。具体来说,它做了以下几件事情:
遍历所有烟花对象,如果烟花还存活,则在画布上显示它的效果并更新它的状态;否则将烟花爆炸后生成的粒子转化为心形对象,并将烟花从
fireworks
列表中移除。遍历所有心形对象,显示它们的效果并更新它们的状态。
在
root
窗口上注册一个定时器,在 25 毫秒之后再次调用draw
函数,实现连续播放动画的效果。
相关文章:

【python】python爱心代码【附源码】
一、实现效果: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码: import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…...

Linux---信号
前言 到饭点了,我点了一份外卖,然后又开了一把网游,这个时候,我在打游戏的过程中,我始终记得外卖小哥会随时给我打电话,通知我我去取外卖,这个时候游戏还没有结束。我在打游戏的过程中需要把外…...
24种设计模式之行为型模式(下)-Java版
软件设计模式是前辈们代码设计经验的总结,可以反复使用。设计模式共分为3大类,创建者模式(6种)、结构型模式(7种)、行为型模式(11种),一共24种设计模式,软件设计一般需要满足7大基本原则。下面通过5章的学习一起来看看设计模式的魅…...

基于微信小程序的校园水电费管理小程序的研究与实现
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

python二维高斯热力图绘制简单的思路代码
import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …...
k8s 部署 nocas 同时部署mysql
使用 ygqygq2 的 helm 模板部署 官方地址:https://artifacthub.io/packages/helm/ygqygq2/nacos 添加 helm 仓库 helm repo add ygqygq2 https://ygqygq2.github.io/charts/下载 helm 安装文件 helm pull ygqygq2/nacos解压 tar -zxvf nacos-2.1.6.tgz执行 hel…...
GolangCI-Lint配置变更实践
GolangCI-Lint配置变更实践 Golang编程中,为了便于调试和代码质量和安全性检查。利用该方法可以在开发周期的早期捕获错误,并且检查团队编程风格,提高一致性。这对团队协作开发特别有用,可以提高开发的效率,保持代码质…...

UE中对象创建方法示例和类的理解
对象创建方法示例集 创建Actor示例 //创建一个护甲道具 AProp* armor GetWorld()->SpawnActor<AProp>(pos, rotator); 创建Component示例 UCapsuleComponent* CapsuleComponent CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent&qu…...

ElementUI鼠标拖动没列宽度
其实 element ui 表格Table有提供给我们一个resizable属性 按官方文档上描述 它就是控制是否允许拖拽表格列大小的属性 而且 它的默认值就是 true 但是依旧很多人会反应拖拽不了 首先 表格要有边框 如果没有变宽 确实是拖拽不了 给 el-table加上 border属性 运行结果如下 但…...

Flutter canvas 画一条会动的波浪线 进度条
之前用 Flutter Canvas 画过一个三角三角形,html 的 Canvas 也画过一次类似的, 今天用 Flutter Canvas 试了下 感觉差不多: html 版本 大致效果如下: 思路和 html 实现的类似: 也就是找出点的位置,使用二阶…...
算法训练营day22, 回溯2
216. 组合总和 III func combinationSum3(k int, n int) [][]int { //存储全部集合 result : make([][]int, 0) //存储单次集合 path : make([]int, 0) var backtrace func(k int, n int, sum int, startIndex int) backtrace func(k int, n int, sum int, startIndex int) {…...

undefined symbol: avio_protocol_get_class, version LIBAVFORMAT_58
rv1126上进行编译和在虚拟机里面进行交叉编译ffmpeg都不行 解决办法查看 查看安装的ffmpeg链接的文件 ldd ./ffmpeg rootEASY-EAI-NANO:/home/nano/ffmpeg-4.3.6# ldd ffmpeg linux-vdso.so.1 (0xaeebd000)libavdevice.so.58 > /lib/arm-linux-gnueabihf/libavde…...

Android简单支持项目符号的EditText
一、背景及样式效果 因项目需要,需要文本编辑时,支持项目符号(无序列表)尝试了BulletSpan,但不是很理想,并且考虑到影响老版本回显等因素,最终决定自定义一个BulletEditText。 先看效果&…...

【axios报错异常】: Uncaught ReferenceError: axios is not defined
问题描述: 当前代码在vivo手机和小米手机运行是正常的,点击分享按钮调出相关弹框,发送接口进行分享,但是现在oppo手机出现了问题: 点击分享按钮没有反应. 问题解析: 安卓同事经过查询后,发现打印了错误: 但是不清楚这个问题是安卓端造成的还是前端造成的,大家都不清楚. 问题…...

Docker基础与持续集成
docker 基础知识: docker与虚拟机 !左边为虚拟机,右边为docker环境 – Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统…...

flutter开发实战-ijkplayer视频播放器功能
flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候,在Android上会出现解码失败的问题,better_player使用的是video_player,video_player很多视频无法解码。最终采用ijkplayer播放器插件,在flutt…...

SpringFramework实战指南(五)
SpringFramework实战指南(五) 4.3 基于 注解 方式管理 Bean4.3.1 实验一: Bean注解标记和扫描 (IoC)4.3.2 实验二: 组件(Bean)作用域和周期方法注解4.3.3 实验三: Bean属性赋值:引用类型自动装配 (DI)4.3.4 实验四: Bean属性赋值:基本类型属性赋值 (DI)4.3.5 实验五:…...

力扣 121. 买卖股票的最佳时机
题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了,啥啥都忘了 C题解1:贪心算法。(来源代码随想录) 因为股票就买卖一次,那么贪心的想法很自然就是取…...

【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解
(转载)原文链接:https://blog.csdn.net/qq_39344192/article/details/131470735 1. 什么是UART? UART是一种异步串行通信接口,常用于通过串口与外部设备进行通信。它通过发送和接收数据帧来实现数据传输,使…...

基于Java医院管理系统设计与实现(源码+部署文档)
博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...