跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. 简介
  2. 代码展示
  3. 运行说明
Python算法

Python 使用 tkinter 绘制动态爱心动画

该脚本利用 Python 的 tkinter 库结合数学三角函数公式,在画布上绘制并动画化一个爱心形状。代码通过参数方程计算坐标点,引入随机扩散算法模拟粒子效果,实现了动态闪烁的爱心视觉呈现。无需额外第三方库依赖,可直接运行查看效果。

不羁发布于 2025/2/7更新于 2026/4/191 浏览
Python 使用 tkinter 绘制动态爱心动画

简介

本示例展示了如何使用 Python 的 tkinter 库结合数学公式绘制动态爱心动画。

代码展示

import random
from math import sin, cos, pi, log
from tkinter import *

CANVAS_WIDTH = 640 
CANVAS_HEIGHT = 480 
CANVAS_CENTER_X = CANVAS_WIDTH / 2
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2
IMAGE_ENLARGE = 11
HEART_COLOR = "#ff2121"

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 = - / (((x - CANVAS_CENTER_X) **  + (y - CANVAS_CENTER_Y) ** ) ** ) 
    dx = ratio * force * (x - CANVAS_CENTER_X)
    dy = ratio * force * (y - CANVAS_CENTER_Y)
     x - dx, y - dy

 ():
    

      * ( * sin( * p)) / ( * pi)

 :
    
     ():
        ._points = () 
        ._edge_diffusion_points = () 
        ._center_diffusion_points = ()  
        .all_points = {} 
        .build()

        .random_halo = 

        .generate_frame = generate_frame
         frame  (generate_frame):
            .calc(frame)

     ():
        
         _  (number):
            t = random.uniform(,  * pi)
            x, y = heart_function(t)
            ._points.add((x, y))

        
         _x, _y  (._points):
             _  ():
                x, y = scatter_inside(_x, _y, )
                ._edge_diffusion_points.add((x, y))

        point_list = (._points)
         _  ():
            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, )
            ._center_diffusion_points.add((x, y))


     ():
        
        force =  / (((x - CANVAS_CENTER_X) **  + (y - CANVAS_CENTER_Y) ** ) ** ) 

        dx = ratio * force * (x - CANVAS_CENTER_X) + random.randint(-, )
        dy = ratio * force * (y - CANVAS_CENTER_Y) + random.randint(-, )

         x - dx, y - dy

     ():
        ratio =  * curve(generate_frame /  * pi)  

        halo_radius = ( +  * ( + curve(generate_frame /  * pi)))
        halo_number = ( +  * (curve(generate_frame /  * pi) ** ))

        all_points = []

        
        heart_halo_point = ()
         _  (halo_number):
            t = random.uniform(,  * pi) 
            x, y = heart_function(t, shrink_ratio=) 
            x, y = shrink(x, y, halo_radius)
             (x, y)   heart_halo_point:
                
                heart_halo_point.add((x, y))
                x += random.randint(-, )
                y += random.randint(-, )
                size = random.choice((, , ))
                all_points.append((x, y, size))

        
         x, y  ._points:
            x, y = .calc_position(x, y, ratio)
            size = random.randint(, )
            all_points.append((x, y, size))

        
         x, y  ._edge_diffusion_points:
            x, y = .calc_position(x, y, ratio)
            size = random.randint(, )
            all_points.append((x, y, size))

         x, y  ._center_diffusion_points:
            x, y = .calc_position(x, y, ratio)
            size = random.randint(, )
            all_points.append((x, y, size))

        .all_points[generate_frame] = all_points

     ():
         x, y, size  .all_points[render_frame % .generate_frame]:
            render_canvas.create_rectangle(x, y, x + size, y + size, width=, fill=HEART_COLOR)

 ():
    render_canvas.delete()
    render_heart.render(render_canvas, render_frame)
    main.after(, draw, main, render_canvas, render_heart, render_frame + )

 __name__ == :
    root = Tk() 
    canvas = Canvas(root, bg=, height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    root.mainloop()
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • 如何从零开始学习信息安全与网络安全
  • HTB Fries 靶机实战:从 Gitea 凭据泄露到 AD CS 证书攻击
  • DeepSeek 与通义万相结合制作 AI 视频实战指南
  • 4 位全加器设计与七段数码管显示实现
  • AI 绘画精讲与 AIGC 时代游戏美术设计:从入门到精通
  • Openclaw 连接本地 Ollama 与 Qwen WebUI 无响应问题排查
  • 电平触发与边沿触发的核心区别及适用场景
  • LazyLLM 测评 | 低代码颠覆 AI 开发!代码专家智能体进阶模块实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

1
2
2
0.6
return
def
curve
p
""" :param p: 参数 :return: 正弦 """
return
2
2
4
2
class
Heart
""" """
def
__init__
self, generate_frame=20
self
set
self
set
self
set
self
self
2000
self
1000
self
for
in
range
self
def
build
self, number
# 爱心
for
in
range
0
2
self
# 爱心内扩散
for
in
list
self
for
in
range
3
0.05
self
list
self
for
in
range
4000
0.17
self
@staticmethod
def
calc_position
x, y, ratio
# 调整缩放比例
1
2
2
0.520
1
1
1
1
return
def
calc
self, generate_frame
10
10
int
4
6
1
10
int
3000
4000
abs
10
2
# 光环
set
for
in
range
0
2
11.6
if
not
in
# 处理新的点
14
14
14
14
1
2
2
# 轮廓
for
in
self
self
1
3
# 内容
for
in
self
self
1
2
for
in
self
self
1
2
self
def
render
self, render_canvas, render_frame
for
in
self
self
0
def
draw
main: Tk, render_canvas: Canvas, render_heart: Heart, render_frame=0
'all'
160
1
if
'__main__'
'black'

运行说明

  1. 确保已安装 Python 3 环境。
  2. 将上述代码保存为 .py 文件。
  3. 直接运行即可在窗口中查看动态爱心效果。
  • 负载均衡入门:HAProxy 双 Web 节点集群配置与验证
  • Android System WebView 版本对应安卓系统兼容性指南
  • Unity VR 高分辨率全景视频播放性能优化
  • ChatGPT 使用教程:AI 常用功能与技巧详解
  • 基于 DeepSeek+Vue3 的 AI 对话聊天系统开发实战
  • iOS 开发:iOS 26 系统 UITabBar 液态玻璃效果与 WiFi SSID 获取兼容适配
  • 仿生学突破:SILD 模型助力无人机电力线避障检测
  • Gemini Pro 实测:多模态、推理与代码能力的真实表现
  • WhisperLiveKit 会议纪要模板定制:适配不同场景样式
  • Spring AI Tool 机制详解:让大模型调用外部工具
  • 基于Python的EPICS通讯语音报警系统开发
  • 2026 主流 AI 编程助手深度评测:文心快码、Copilot 与 Cursor