基于 Python 实现的爱心动效,类似电视剧《点燃我温暖你》中展示的视觉效果,可调整窗口大小。

使用以下的技术

  • tkinter 界面库

效果

实践

import random
from math import sin, cos, pi, log
import time
from tkinter import *CANVAS_WIDTH = 1080  # 画布的宽(X)
CANVAS_HEIGHT = 720  # 画布的高(Y)
CANVAS_CENTER_X = CANVAS_WIDTH / 2  # 画布中心的X坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2  # 画布中心的Y坐标def heart_function(t, cx=CANVAS_CENTER_X, cy=CANVAS_CENTER_Y, ratio=10):"""爱心生成器:param t: 参数:param cx: 中心x坐标:param cy: 中心y坐标:param ratio: 放大比例:return: 坐标"""# 心形线函数x = 17 * (sin(t)**3)y = -(16 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(3 * t))# 放大x *= ratioy *= ratio# 移到画布中央x += cxy += cyreturn int(x), int(y)def scatter_inside(x, y, cx=CANVAS_CENTER_X, cy=CANVAS_CENTER_Y, beta=0.15):"""内部扩散:param x: 原x:param y: 原y:param beta: 强度:return: 新坐标"""ratio_x = -beta * log(random.random())ratio_y = -beta * log(random.random())dx = ratio_x * (x - cx)dy = ratio_y * (y - cy)return x - dx, y - dydef rhythmic(p):"""调整跳动周期:param p: 参数:return: 正弦"""return 2 * (2 * sin(4 * p)) / (2 * pi)class Heart:def __init__(self,w=CANVAS_WIDTH,h=CANVAS_HEIGHT,cx=CANVAS_CENTER_X,cy=CANVAS_CENTER_Y,generate_frame=60):self._edge_points = set()self._edge_diffusion_points = set()self._points = set()self.all_frame_points = {}self.w = wself.h = hself.cx = cxself.cy = cyself.build(3000)  # 生成基础的点坐标self.generate_frame = generate_framefor frame in range(generate_frame):self.get_frame(frame)def build(self, number):for _ in range(number):t = random.uniform(0, 2 * pi)x, y = heart_function(t, self.cx, self.cy, 10)self._edge_points.add((x, y))for _x, _y in list(self._edge_points):for _ in range(5):x, y = scatter_inside(_x, _y, self.cx, self.cy, 0.1)self._edge_diffusion_points.add((x, y))point_list = list(self._edge_points)for _ in range(10000):x, y = random.choice(point_list)x, y = scatter_inside(x, y, self.cx, self.cy, 0.3)self._points.add((x, y))@staticmethoddef shrink_position_1st(x,y,cx=CANVAS_CENTER_X,cy=CANVAS_CENTER_Y,ratio=10):force = 1 / (((x - cx)**2 + (y - cy)**2)**0.45)dx = ratio * force * (x - cx) + random.randint(-1, 1)dy = ratio * force * (y - cy) + random.randint(-1, 1)return x - dx, y - dy@staticmethoddef shrink_position_2st(x,y,cx=CANVAS_CENTER_X,cy=CANVAS_CENTER_Y,ratio=10):force = -1 / (((x - cx)**2 + (y - cy)**2)**0.6)dx = ratio * force * (x - cx)dy = ratio * force * (y - cy)return x - dx, y - dydef get_frame(self, generate_frame):all_kind_points = {"heart_edge": [],"heart_edge_diffusion": [],"heart": [],"heart_halo": []}ratio = 15 * rhythmic(generate_frame / 10 * pi)  # 周期性的缩放系数# 动态变化的爱心轮廓for x, y in self._edge_points:x, y = self.shrink_position_1st(x, y, self.cx, self.cy, ratio)size = random.randint(1, 2)all_kind_points["heart_edge"].append((x, y, size))# 动态变化的扩散的爱心轮廓for x, y in self._edge_diffusion_points:x, y = self.shrink_position_1st(x, y, self.cx, self.cy, ratio)size = random.randint(1, 2)all_kind_points["heart_edge_diffusion"].append((x, y, size))# 动态变化的爱心for x, y in self._points:x, y = self.shrink_position_1st(x, y, self.cx, self.cy, ratio)size = random.randint(1, 2)all_kind_points["heart"].append((x, y, size))# 固定大小的爱心光晕halo_radius = int(4 + 6 * (1 + rhythmic(generate_frame / 10 * pi)))halo_number = int(4000 + 6000 *(1 + rhythmic(generate_frame / 10 * pi)))heart_halo_point = set()for _ in range(halo_number):t = random.uniform(0, 2 * pi)x, y = heart_function(t, self.cx, self.cy, ratio=10)x, y = self.shrink_position_2st(x, y, self.cx, self.cy,halo_radius)if (x, y) not in heart_halo_point:heart_halo_point.add((x, y))x += random.randint(-40, 40)y += random.randint(-40, 40)size = random.choice((1, 2, 1))all_kind_points["heart_halo"].append((x, y, size))all_kind_points["heart_halo"].append((x + 20, y + 20, size))all_kind_points["heart_halo"].append((x - 20, y - 20, size))all_kind_points["heart_halo"].append((x + 20, y - 20, size))all_kind_points["heart_halo"].append((x - 20, y + 20, size))self.all_frame_points[generate_frame] = all_kind_pointsdef render(self, canvas, current_frame):for x, y, size in self.all_frame_points[current_frame % self.generate_frame]["heart_edge"]:canvas.create_rectangle(x,y,x + size,y + size,width=0,fill="#ef7a82")for x, y, size in self.all_frame_points[current_frame % self.generate_frame]["heart_edge_diffusion"]:canvas.create_rectangle(x,y,x + size,y + size,width=0,fill="#ef7a82")for x, y, size in self.all_frame_points[current_frame %self.generate_frame]["heart"]:canvas.create_rectangle(x,y,x + size,y + size,width=0,fill="#ff2d51")for x, y, size in self.all_frame_points[current_frame % self.generate_frame]["heart_halo"]:canvas.create_rectangle(x,y,x + size,y + size,width=0,fill="#ff2d51")def draw(winer: Tk,w=CANVAS_WIDTH,h=CANVAS_HEIGHT,cx=CANVAS_CENTER_X,cy=CANVAS_CENTER_Y,current_frame=0):global canvasglobal heartif current_frame == 0:canvas = Canvas(winer, bg='black', bd=0, width=w, height=h)canvas.pack()heart = Heart(w=w, h=h, cx=cx, cy=cy, generate_frame=60)if current_frame != 0:if winer.winfo_width() != w + 6 or winer.winfo_height() != h + 6:w = winer.winfo_width() - 6h = winer.winfo_height() - 6cx = w / 2cy = h / 2canvas.destroy()winer.update()time.sleep(0.03)canvas = Canvas(winer, bg='black', bd=0, width=w, height=h)canvas.pack()heart = Heart(w=w, h=h, cx=cx, cy=cy, generate_frame=60)canvas.delete('all')heart.render(canvas, current_frame)winer.after(int(1000 / 60), draw, winer, w, h, cx, cy, current_frame + 1)if __name__ == '__main__':# 创建窗口事件root = Tk()root.title("跳动的心")# 在窗口中定义绘制draw(winer=root,w=CANVAS_WIDTH,h=CANVAS_HEIGHT,cx=CANVAS_CENTER_X,cy=CANVAS_CENTER_Y,current_frame=0)# 执行窗口事件root.mainloop()print("运行完成")

Python的爱心动效相关推荐

  1. 用python画爱心动图_编写Python爬虫抓取暴走漫画上gif图片的实例分享

    本文要介绍的爬虫是抓取暴走漫画上的GIF趣图,方便离线观看.爬虫用的是python3.3开发的,主要用到了urllib.request和BeautifulSoup模块. urllib模块提供了从万维网 ...

  2. 前端小项目3 # DoubleClickHeart 双击图片产生爱心动效

    涉及知识点 鼠标事件 JavaScript操作DOM节点 闭包 HTML中鼠标点击的位置信息 animation 动画 引入图标字体库 介绍 双击图片,在点击处显示爱心动画效果并更新累计点击次数. 代 ...

  3. 表白神器!教你如何使用 Python 绘制爱心墙获取芳心!

    一.爱心墙 通过爬虫搜集到粉丝的头像,然后利用 PIL 库拼接出爱心墙的形状 二.代码分析 1.头像爬取 在个人中心点击我的粉丝便可以看到自己的粉丝 通过抓包可知对应的接口为: > url =' ...

  4. python 爱心背景_表白神器!如何使用 Python 绘制爱心墙!

    一.爱心墙 通过爬虫搜集到粉丝的头像,然后利用 PIL 库拼接出爱心墙的形状 二.代码分析 1.头像爬取 在个人中心点击我的粉丝便可以看到自己的粉丝 通过抓包可知对应的接口为: url = 'http ...

  5. python画一个心形照片墙_表白神器!如何使用 Python 绘制爱心墙!

    一.爱心墙 通过爬虫搜集到粉丝的头像,然后利用 PIL 库拼接出爱心墙的形状 二.代码分析 1.头像爬取 在个人中心点击我的粉丝便可以看到自己的粉丝 通过抓包可知对应的接口为:url = 'https ...

  6. python手机壁纸_利用Appium Python测试爱壁纸的登录和设置壁纸

    #coding:utf-8#Import the common package importosimportunittestfrom appium importwebdriverfrom time i ...

  7. python安卓吾爱_【原创源码】 【无需第三方库】【支持签到 】 Python 吾爱挂机 无提示版...

    [Python] 纯文本查看 复制代码#!/usr/bin/env python # -*- coding: utf-8 -*- import time import urllib2 import s ...

  8. 用python画笛卡尔心形线_05.总是套路得人心,如何用数学+Python示爱!

    接上题: 心里随便想一个数a,计算 ( ( a + 52.8 ) * 5 - 3.9343 ) * 2 - 10a ( ( a + 52.8 ) * 5 - 3.9343 ) * 2 - 10a = ...

  9. 仿抖音视频详情页点赞红心动效

    GitHub地址: https://github.com/selfconzrr/LikeAnimator 可直接测试运行 效果预览 核心思路: 自定义 View 继承自 RelativeLayout ...

最新文章

  1. javaOOP项目实战——银行ATM机
  2. Windows进程间通信的各种方法
  3. agv ti 毫米波雷达_激光雷达VS毫米波雷达 谁才是自动驾驶“头号玩家”?
  4. FileInputStream 把文件作为字节流进行读操作
  5. 标准c语言有几个关键字,C语言有多少个关键字
  6. Fixjs——显示交互基类InteractiveObject
  7. greenplum客户端工具_GreenPlum数据加载工具gpload | 信春哥,系统稳,闭眼上线不回滚!...
  8. CentOS 安装JDK8
  9. Eclipse的汉化
  10. 【笔试题】刺客信条/Assassin’s Creed (阿里巴巴2020.08.26笔试第二题)
  11. VMWare 16 pro虚拟机无法开启,打不开磁盘“E:\ubuntu16.04.vmdk”或它所依赖的某个快照磁盘,显示模块“Disk”启动失败
  12. Android平台渗透测试套件--zANTI2.5
  13. 程序与数学:平方根计算与牛顿迭代法
  14. 井字棋游戏案例C++语言
  15. bootstrapTable 根据条件隐藏某列
  16. 七大设计原则之接口隔离原则
  17. 用计算机问答,计算机应用基础问答题
  18. gitlab-ci添加安卓项目构建流程
  19. C语言集锦(一) C代码生成图片:BMP、PNG和JPEG
  20. Linux中使用命令查看目录信息、查看当前目录路径、清楚终端内容

热门文章

  1. 浅谈一个完整网站配色方案设计大法3实战篇
  2. 当代教育实践与教学研究杂志社当代教育实践与教学研究编辑部2022年第24期目录
  3. 【必看】App Store 要求App填写隐私保护问卷?别慌!友小盟手把手教你填~
  4. 1316:数的计数(Noip2001)
  5. 光盘出租系统mysql_[数据库应用] 影碟出租管理系统
  6. ubuntu9.04安装xmms
  7. 测试问卷星问卷公开的问题
  8. Aurix Tricore TC397定义变量至LMU程序异常的解决办法
  9. 做人的六原则 40条心计 共勉
  10. 错误:数据提供程序或其他服务返回E_FAIL状态 到底怎么回事呢?