import random # 随机函数模块
import pyttsx3 # 文字转语音模块
from pygame import mixer # mp3播放模块
from math import sin, cos, pi, log # 核心模块,数学函数
from tkinter import * # 窗口主体模块
CANVAS_WIDTH = 1920 # 画布的宽
CANVAS_HEIGHT = 1080 # 画布的高
CANVAS_CENTER_X = CANVAS_WIDTH / 2 # 画布中心的X轴坐标
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 # 画布中心的Y轴坐标
IMAGE_ENLARGE = 15 # 放大比例
HEART_COLOR = "#Fd789f" # 心的颜色,少女粉
def speak_voice(message, speak_mode=0):
"""
“文字转语音”
:param message: 文本消息
:param speak_mode: 语音包,0 中文女声,1 英文女声,2 英文男声
"""
# 初始化
engine = pyttsx3.init()
voices = engine.getProperty('voices')
# 改变语速 范围为0-200 默认值为200
rate = engine.getProperty('rate')
engine.setProperty('rate', rate - 100)
# 设置音量 范围为0.0-1.0 默认值为1.0
engine.setProperty('volume', 0.8)
# 设置发音人,目前只有0可以说中文
engine.setProperty('voice', voices[speak_mode].id)
# 预设要朗读的文本数据
engine.say(message)
# 读出声音
engine.runAndWait()
def heart_voice(file_path, playback_mode=-1):
"""
“噗噗的心跳声”
:param file_path: mp3文件路径
:param playback_mode: 播放模式,-1 为循环播放
"""
# 初始化
mixer.init()
# 加载文件路径
mixer.music.load(file_path)
# 播放mp3文件
mixer.music.play(playback_mode)
def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
"""
“爱心函数生成器”
:param shrink_ratio: 放大比例
:param t: 参数
:return: 坐标
"""
# 基础函数
x = 16 * (sin(t) ** 3)
y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
# 放大
x *= shrink_ratio
y *= shrink_ratio
# 移到画布中央
x += CANVAS_CENTER_X
y += CANVAS_CENTER_Y
return int(x), int(y)
def scatter_inside(x, 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 - CANVAS_CENTER_X)
dy = ratio_y * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
def shrink(x, y, ratio):
"""
抖动
:param x: 原x
:param y: 原y
:param ratio: 比例
:return: 新坐标
"""
force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6) # 这个参数...
dx = ratio * force * (x - CANVAS_CENTER_X)
dy = ratio * force * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
def curve(p):
"""
自定义曲线函数,调整跳动周期
:param p: 参数
:return: 正弦
"""
# 可以尝试换其他的动态函数,达到更有力量的效果(贝塞尔?)
return 2 * (2 * sin(4 * p)) / (2 * pi)
class Heart:
"""
爱心类
"""
def __init__(self, generate_frame=20):
self._points = set() # 原始爱心坐标集合
self._edge_diffusion_points = set() # 边缘扩散效果点坐标集合
self._center_diffusion_points = set() # 中心扩散效果点坐标集合
self.all_points = {} # 每帧动态点坐标
self.build(2000)
self.random_halo = 1000
self.generate_frame = generate_frame
for frame in range(generate_frame):
self.calc(frame)
def build(self, number):
# 爱心
for _ in range(number):
t = random.uniform(0, 2 * pi) # 随机不到的地方造成爱心有缺口
x, y = heart_function(t)
self._points.add((x, y))
# 爱心内扩散
for _x, _y in list(self._points):
for _ in range(3):
x, y = scatter_inside(_x, _y, 0.05)
self._edge_diffusion_points.add((x, y))
# 爱心内再次扩散
point_list = list(self._points)
for _ in range(4000):
x, y = random.choice(point_list)
x, y = scatter_inside(x, y, 0.17)
self._center_diffusion_points.add((x, y))
@staticmethod
def calc_position(x, y, ratio):
# 调整缩放比例
force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520) # 魔法参数
dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-1, 1)
dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-1, 1)
return x - dx, y - dy
def calc(self, generate_frame):
ratio = 10 * curve(generate_frame / 10 * pi) # 圆滑的周期的缩放比例
halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))
halo_number = int(3000 + 4000 * abs(curve(generate_frame / 10 * pi) ** 2))
all_points = []
# 光环
heart_halo_point = set() # 光环的点坐标集合
for _ in range(halo_number):
t = random.uniform(0, 2 * pi) # 随机不到的地方造成爱心有缺口
x, y = heart_function(t, shrink_ratio=11.6) # 魔法参数
x, y = shrink(x, y, halo_radius)
if (x, y) not in heart_halo_point:
# 处理新的点
heart_halo_point.add((x, y))
x += random.randint(-14, 14)
y += random.randint(-14, 14)
size = random.choice((1, 2, 2))
all_points.append((x, y, size))
# 轮廓
for x, y in self._points:
x, y = self.calc_position(x, y, ratio)
size = random.randint(1, 3)
all_points.append((x, y, size))
# 内容
for x, y in self._edge_diffusion_points:
x, y = self.calc_position(x, y, ratio)
size = random.randint(1, 2)
all_points.append((x, y, size))
for x, y in self._center_diffusion_points:
x, y = self.calc_position(x, y, ratio)
size = random.randint(1, 2)
all_points.append((x, y, size))
self.all_points[generate_frame] = all_points
def render(self, render_canvas, render_frame):
for x, y, size in self.all_points[render_frame % self.generate_frame]:
render_canvas.create_rectangle(x, y, x + size, y + size, width=0, fill=HEART_COLOR)
def draw(main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0):
render_canvas.delete('all')
render_heart.render(render_canvas, render_frame)
main.after(160, draw, main, render_canvas, render_heart, render_frame + 1)
if __name__ == '__main__':
root = Tk() # 一个Tk
root.title("李峋同款代码【有声版】") # 标题
canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
canvas.pack()
heart = Heart() # 心
draw(root, canvas, heart) # 开始画画
speak_voice("请收下我的心!") # 要对她说的话
heart_voice("mp3/51miz-S283175-043A2FE9.mp3") # 心跳声音
root.mainloop()
没有合适的资源?快使用搜索试试~ 我知道了~
内容概要 李洵爱心Python代码是一段用Python语言编写的可视化代码,通过简单的数学公式和绘图函数生成爱心形状的图案。代码短小精悍,具有极强的趣味性和创造力,适合初学者和编程爱好者学习Python绘图基础知识,同时也可以用于制作具有个人特色的表达情感的图案。 适用人群 这段代码适用于Python编程的初学者、对图形可视化感兴趣的开发者,以及需要用编程表达创意和情感的人群。尤其适合那些刚开始学习Python编程并希望快速上手简单项目的学习者。 使用场景及目标 李洵爱心Python代码可以用于教学和学习Python语言的基本绘图功能,适合在课堂、编程实验室或个人学习中使用。它的目标是通过轻松有趣的方式,帮助学习者掌握如何使用Python的数学和绘图库生成图案,提升学习兴趣,同时也是表达浪漫或感情的创意编程作品。 其他如何使用说明 下载Python并安装相关库:首先确保计算机中安装了Python,并使用pip install matplotlib安装绘图库。 编写或下载代码:获取李洵爱心代码,复制到Python环境中。 运行代码:在Python IDE或命令行中运行代码,即可生成
资源推荐
资源详情
资源评论
收起资源包目录
爱心代码(17款).zip (17个子文件)
1.py 1KB
2.py 1KB
14.py 500B
7.py 5KB
8.py 5KB
13.py 336B
4.py 2KB
6.py 6KB
11.py 335B
16.py 178B
12.py 7KB
15.py 548B
10.py 413B
9.py 3KB
17.py 141B
3.py 1KB
5.py 6KB
共 17 条
- 1
资源评论
科技先锋者
- 粉丝: 122
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功