banner
andrewji8

Being towards death

Heed not to the tree-rustling and leaf-lashing rain, Why not stroll along, whistle and sing under its rein. Lighter and better suited than horses are straw sandals and a bamboo staff, Who's afraid? A palm-leaf plaited cape provides enough to misty weather in life sustain. A thorny spring breeze sobers up the spirit, I feel a slight chill, The setting sun over the mountain offers greetings still. Looking back over the bleak passage survived, The return in time Shall not be affected by windswept rain or shine.
telegram
twitter
github

Python Beating Heart Code

Christmas is coming, and the opportunity to confess to the goddess has arrived. Without further ado, let's see the effect..

image

import tkinter as tk
import tkinter.messagebox
import random
from math import sin, cos, pi, log
from tkinter.constants import *
width = 888
height = 500
heartx = width / 2
hearty = height / 2
side = 11
heartcolor = "pink"  # Heart color, can be modified
class Heart:
    def __init__(self, generate_frame=20):
        self._points = set()  # Original heart coordinate set
        self._edge_diffusion_points = set()  # Edge diffusion effect point coordinates set
        self._center_diffusion_points = set()  # Center diffusion effect point coordinates set
        self.all_points = {}  # Dynamic point coordinates for each frame
        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 - heartx) ** 2 + (y - hearty) ** 2) ** 0.520)  # Magic parameter
        dx = ratio * force * (x - heartx) + random.randint(-1, 1)
        dy = ratio * force * (y - hearty) + random.randint(-1, 1)
        return x - dx, y - dy
    def calc(self, generate_frame):
        ratio = 10 * curve(generate_frame / 10 * pi)  # Smooth periodic scaling ratio
        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=heartcolor)
def heart_function(t, shrink_ratio: float = side):
    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 += heartx
    y += hearty
    return int(x), int(y)
def scatter_inside(x, y, beta=0.15):
    ratio_x = - beta * log(random.random())
    ratio_y = - beta * log(random.random())
    dx = ratio_x * (x - heartx)
    dy = ratio_y * (y - hearty)
    return x - dx, y - dy
def shrink(x, y, ratio):
    force = -1 / (((x - heartx) ** 2 + (y - hearty) ** 2) ** 0.6)
    dx = ratio * force * (x - heartx)
    dy = ratio * force * (y - hearty)
    return x - dx, y - dy
def curve(p):
    return 2 * (2 * sin(4 * p)) / (2 * pi)
def draw(main: tk.Tk, render_canvas: tk.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)
def love():
    root = tk.Tk()
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    x = (screenwidth - width) // 2
    y = (screenheight - height) // 2 - 66
    root.geometry("%dx%d+%d+%d" % (width, height, x, y))
    root.title("❤")
    canvas = tk.Canvas(root, bg='black', height=height, width=width)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    tk.Label(root, text="I Love You!", bg="black", fg="#FF99CC", font="Helvetic 25 bold").place(relx=.5, rely=.5,
                                                                                                anchor=CENTER)
    root.mainloop()
if __name__ == '__main__':
    root = tk.Tk()
    root.title('❤')
    root.resizable(0, 0)
    root.wm_attributes("-toolwindow", 1)
    screenwidth = root.winfo_screenwidth()
    screenheight = root.winfo_screenheight()
    widths = 300
    heights = 100
    x = (screenwidth - widths) / 2
    y = (screenheight - heights) / 2 - 66
    root.geometry('%dx%d+%d+%d' % (widths, heights, x, y))  # Set to display centered on the screen
    tk.Label(root, text='Dear, will you be my girlfriend?', width=37, font=('Songti', 12)).place(x=0, y=10)
    def OK():  # Agree button
        root.destroy()
        love()  # Show dynamic heart after agreeing
    def NO():  # Refuse button, refusal will not exit, must agree to exit~
        tk.messagebox.showwarning('❤', 'One more chance for you!')
    def closeWindow():
        tk.messagebox.showwarning('❤', 'Avoiding is useless')
    tk.Button(root, text='Okay', width=5, height=1, command=OK).place(x=80, y=50)
    tk.Button(root, text='No', width=5, height=1, command=NO).place(x=160, y=50)
    root.protocol('WM_DELETE_WINDOW', closeWindow)  # Bind exit event
    root.mainloop()

This code implements a program that draws a beating heart using Python's Tkinter library, which includes a pop-up asking whether to be someone's girlfriend. If agreed, a beating heart will be displayed; if refused, it will ask again. (No solution, must agree~)

Below is a detailed analysis of the code:

  1. Import necessary libraries
    First, some necessary Python libraries are imported, including the Tkinter library and some mathematical function libraries and constant libraries. These libraries are used for functionalities needed in the program, such as drawing, random number generation, and mathematical function calculations.

  2. Set constants
    Next, some constants are set, including the width and height of the window, the color of the heart, and the size of the heart shape.

  3. Define heart class
    A class named Heart is defined, which includes some functions and variables. In the __init__ function, the original heart coordinate set (self._points), edge diffusion effect point coordinates set (self._edge_diffusion_points), center diffusion effect point coordinates set (self._center_diffusion_points), and the dynamic point coordinates set for each frame (self.all_points) are defined. The build function is then called to generate the original heart coordinate set, edge diffusion effect point coordinates set, and center diffusion effect point coordinates set. In the build function, a certain number of original heart coordinates are generated and added to the self._points set. Then, for each original heart coordinate, three random offsets are generated and added to the edge diffusion effect point coordinates set through the scatter_inside function. Finally, a random original heart coordinate is selected, shrunk to a certain radius using the shrink function, and added to the center diffusion effect point coordinates set.

In another function calc, the scaling ratio of the radius, the halo radius, and the number of halos are defined, and a certain number of halo points are generated and added to self.all_points. Then, for each point set, the new coordinates are calculated by calling the calc_position function, and added to all_points. In the calc_position function, the size and direction of the force are calculated based on the current point and the position of the heart, and the point is randomly moved a certain distance based on this size and direction. Finally, in the render function, all points in the point set are drawn on the canvas.

  1. Draw heart
    The draw function continuously draws the changing heart on the canvas, achieving the effect of a dynamic heart.

  2. Inquiry window
    In the main function, a Tkinter window named root is first created, and its title and size are set. Then, two inquiry button functions (agree and refuse) are created and their positions and response functions are set in the window. A function closeWindow is defined to remind the user that avoiding the issue is not a solution when the window close button is clicked. Finally, the mainloop function is called to enter the main loop, waiting for the user's response.

In summary, this code implements a simple interactive dynamic heart program that can draw a beating heart through corresponding functions and interact with the user through pop-ups.

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.