Use the tkinter library in python to make a beating purple heart

# Beating Heart
# default input
import random
from math import sin, cos, pi, log
from tkinter import *

CANVAS_WIDTH = 980 # Canvas height
CANVAS_HEIGHT = 720 #Canvas width
CANVAS_CENTER_X = CANVAS_WIDTH / 2 # Canvas center point x-axis coordinate
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2 # The x-axis coordinate of the canvas center point
IMAGE_ENLARGE = 11 # Magnification ratio
# color list
HEART_COLOR_LIST = ["#e66771", "#be77fa", "#a478f3", "#8b78ea", "#7377e0",
"#4871c6", "#5c74d3", "#fa6ea9", "#dc6db1", "#ec2c2c",
"#e91e41", "#8b4593", "#2bd3ec", "#00be93", "#2bec62"]


def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
    """
    generate love
    :param shrink_ratio: ratio
    :param t: parameter
    :return: x, y
    """
    #Basic love generation function
    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))

    #zoom
    x *= shrink_ratio
    y *= shrink_ratio

    #center
    x + = CANVAS_CENTER_X
    y + = CANVAS_CENTER_Y

    return int(x), int(y)


def scatter_inside(x, y, beta=1.15):
    """
    random inner spreading
    :param x: orig x
    :param y: orig y
    :param beta: strength
    :return: new x, y
    """
    #Use beta as the particle intensity multiplier to create particle effects
    ratio_x = - beta * log(random.random())
    ratio_y = - beta * log(random.random())
    #Limit particle effect area
    dx = ratio_x * (x - CANVAS_CENTER_X)
    dy = ratio_y * (y - CANVAS_CENTER_Y)

    return x - dx, y - dy


def shrink(x, y, ratio):
    """
    shrink
    :param x: orig x
    :param y: orig y
    :param ratio: ratio
    :return: new x,y
    """
    force = -1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.6) # This parameter...
    dx = ratio * force * (x - CANVAS_CENTER_X)
    dy = ratio * force * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy


def curve(p):
    """
    tune beating period
    :param p: parameter
    :return: sin
    """
    #alg
    return 2 * (2 * sin(4 * p)) / (2 * pi)


classHeart:
    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)
            #Create a collection of overall points for the love effect
    def build(self, number):
        #heart
        for _ in range(number):
            t = random.uniform(0, 2 *pi)
            x, y = heart_function(t)
            self._points.add((x, y))

    # inner heart 1
    #Traverse the effect center point coordinate set, use the actual outline center of the heart to spread the heart inward, and add the effect point coordinates to the list each time an edge effect is generated.
        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))

    #innerheart2
    #Generate a center diffusion effect and add the center point of the effect to the list
        point_list = list(self._points)
        for _ in range(6000):
            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):
        #tune ratio
        force = 1 / (((x - CANVAS_CENTER_X) ** 2 + (y - CANVAS_CENTER_Y) ** 2) ** 0.520) # alg

        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) # curve

        halo_radius = int(4 + 6 * (1 + curve(generate_frame / 10 * pi)))
        halo_number = int(3000 + 6000 * abs(curve(generate_frame / 10 * pi) ** 2))

        all_points = []

        #ring
        heart_halo_point = set() # x,y of ring pts

#Create love particle effect layers and dithering effects
        for _ in range(halo_number):
                t = random.uniform(0, 2 *pi)
                x, y = heart_function(t, shrink_ratio=11.6) # alg
                x, y = shrink(x, y, halo_radius)
                if (x, y) not in heart_halo_point:
                # new pts
                    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))

    # outline
        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))

            #content
            #Traverse the edge effect point collection and add the canvas display point collection
        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))

    #Traverse the center effect point collection and add the canvas display point collection
        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

##Traverse the love point set, fill the color and define the size of the love point set
    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=random.choice(HEART_COLOR_LIST))


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(70, draw, main, render_canvas, render_heart, render_frame + 1)


if __name__ == '__main__':
    root = Tk() # Tk
    #Canvas creation
    canvas = Canvas(root, bg='black',height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    # Create love point set
    heart = Heart()
    #爱 generate
    draw(root, canvas, heart) # draw
    #Generate and add text labels
    text1 = Label(root, text="By XXX", font=("Helvetica", 18), fg="#c12bec", bg="black")
    text1.place(x=650, y=500)
    text2 = Label(root, text="XXX", font=("Helvetica", 18), fg="#c12bec", bg="black")
    text2.place(x=460, y=350)
    root.mainloop()

The knowledge points of the article match the official knowledge files, and you can further learn relevant knowledge. Python entry skill treeDesktop application developmentTkinter388428 people are learning the system