posted on 2023-05-07 20:12 read(498) comment(0) like(0) collect(0)
最近大火的电视剧《点燃我温暖你》出现,令我的家庭地位进一步下降,因为男主“李峋”已经变成了她的大老公,而我就被打入冷宫. 为了满足她的“攀比心”,我连夜给她实现了粉红色爱心的跳动,让她看到满满的爱意.
本文特意将两种代码都进行分享, 为了能够让大家体会到两种代码实现的效果, 特意放出下面的效果图来帮助大家对比
(https://img-blog.csdnimg.cn/img_convert/de7412e9b0abf45bbb41c1f2dc4bc255.png)
(https://img-blog.csdnimg.cn/img_convert/d98ed8aa51a44d8d213099f88f5b3006.png)
import random from math import sin, cos, pi, log from tkinter import * CANVAS_WIDTH = 840 # 画布的宽 CANVAS_HEIGHT = 680 # 画布的高 CANVAS_CENTER_X = CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 # 画布中心的Y轴坐标 IMAGE_ENLARGE = 11 # 放大比例 HEART_COLOR = "RED" # 引号内修改颜色! def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE): """ “爱心函数生成器” :param shrink_ratio: 放大比例 :param t: 参数 :return: 坐标 """ # 基础函数 x = 17 * (sin(t) ** 3) y = -(16 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(3 * t)) # 放大 # x *= shrink_ratio # y *= shrink_ratio x *= IMAGE_ENLARGE y *= IMAGE_ENLARGE # 移到画布中央 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(10000): x, y = random.choice(point_list) x, y = scatter_inside(x, y, 0.27) 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.420) # 魔法参数 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 = 15 * 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=-15) # 魔法参数 x, y = shrink(x, y, halo_radius) if (x, y) not in heart_halo_point: # 处理新的点 heart_halo_point.add((x, y)) x += random.randint(-60, 60) y += random.randint(-60, 60) size = random.choice((1, 1, 2)) all_points.append((x, y, size)) all_points.append((x + 20, y + 20, size)) all_points.append((x - 20, y - 20, size)) all_points.append((x + 20, y - 20, size)) all_points.append((x - 20, y + 20, 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(1, draw, main, render_canvas, render_heart, render_frame + 1) if __name__ == '__main__': root = Tk() root.title("晚上星月争辉,美梦陪你入睡") canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH) canvas.pack() heart = Heart() draw(root, canvas, heart) root.mainloop()
效果2地址(将冒号后地址复制后放入浏览器即可): docs.qq.com/doc/DUWJNYmx0TkVNY0VP
运行代码(用pycharm打开改代码然后运行即可)
注意: 该代码为Python代码, 运行时需要安装 pycharm 或 IDLE 等开发环境工具. 下面介绍下pycharm基本安装和使用方法. 在最后我们还会介绍如何将代码打包成可以直接运行的exe程序. 无需pycharm即可运行
PyCharm 出自 JetBrains 之手. 是一种 Python IDE,带有一整套可以帮助用户在使用 Python 语言开发时提高其效率的工具.
类似 IDEA, 作为 企业级软件, 用于快速开发 Python 程序, 之前使用过 IDEA 的非常推荐使用.
PyCharm破姐版下载地址(将冒号后地址复制后放入浏览器即可): docs.qq.com/doc/DUVpEeXh2dEtrQXhU
Pycharm 的优点
Pycharm 的缺点
安装使用步骤
安装
直接运行 PyCharm.exe, 然后一直 next , 然后点击 install , 最后点击 Finish
新建项目
开发和运行项目
打开项目后,右键单击项目,new -> FIle , 创建 Python 文件 mypy01
点击 Run-> Run xxx 或者直接 Shift+ F10 运行即可
交互模式和控制台
控制台(Terminal )相当于直接进入了 Windows 的 shell 界面
交互模式相当于进入类似 IDLE 的交互模式:
项目创建后引用的包版本配置
在将上面代码运行无误之后, 我们总不能每次都用pycharm来打开这段代码吧. 所以我们可以利用pycharm打包代码的库 - pyinstaller.用于将代码打包成可以执行的.exe程序
步骤
安装pyinstall
在左上角工具栏找到 File->Setting, 然后按照下图配置
将代码打包成.exe程序
pyinstaller -F -w .\爱心代码文件名.py
打包成功后, 会在当前代码所在目录下, 创建 build和dist目录, 而打包好的程序就在 dis目录下
找到改代码所在目录, 双击运行即可
运行效果如图
Author:mmm
link:http://www.pythonblackhole.com/blog/article/317/60c4d0cf49d73745447a/
source:python black hole net
Please indicate the source for any form of reprinting. If any infringement is discovered, it will be held legally responsible.
name:
Comment content: (supports up to 255 characters)
Copyright © 2018-2021 python black hole network All Rights Reserved All rights reserved, and all rights reserved.京ICP备18063182号-7
For complaints and reports, and advertising cooperation, please contact vgs_info@163.com or QQ3083709327
Disclaimer: All articles on the website are uploaded by users and are only for readers' learning and communication use, and commercial use is prohibited. If the article involves pornography, reactionary, infringement and other illegal information, please report it to us and we will delete it immediately after verification!