Fundamentals 11 min read

Create Stunning Valentine’s Day Heart Graphics with Python in Minutes

This article walks you through four Python heart‑drawing techniques—from a simple text‑based love shape to colorful Turtle graphics and an animated beating heart—providing complete code snippets and visual examples so you can impress anyone this Valentine’s Day.

MaGe Linux Operations
MaGe Linux Operations
MaGe Linux Operations
Create Stunning Valentine’s Day Heart Graphics with Python in Minutes

Valentine’s Day is approaching, and programmers love sharing "love code" that draws heart shapes, a trend that has even trended on Chinese social media. This guide presents four progressively more complex Python examples for creating heart graphics.

Part 1: Text‑Effect Heart

The first example prints a heart made of the word "Love" using a mathematical condition to shape the characters.

print('
'.join([''.join(('Love'[(x-y) % len('Love')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))

Result:

Part 2: Red Heart with Turtle

This snippet uses the turtle module to draw a solid red heart.

import turtle as t
t.color('red')
t.setheading(50)
t.begin_fill()
t.circle(-100, 170)
t.circle(-300, 40)
t.right(38)
t.circle(-300, 40)
t.circle(-100, 170)
t.end_fill()
t.done()

Result:

Part 3: Custom Message Heart

This version prompts the user for a love message and a recipient’s name, then draws a heart and writes the text inside.

import turtle as t
import time

def LittleHeart():
    for i in range(200):
        t.right(1)
        t.forward(2)

love = input('请输入表白语句,然后回车,默认为"I Love You":
')
me = input('请输入要表白的人:
')
if love == '':
    love = 'I Love you'

t.setup(width=900, height=600)
 t.color('red', 'pink')
 t.pensize(5)
 t.speed(10)
 t.up()
 t.hideturtle()
 t.goto(0, -180)
 t.showturtle()
 t.down()
 t.speed(5)
 t.begin_fill()
 t.left(140)
 t.forward(224)
 LittleHeart()
 t.left(120)
 LittleHeart()
 t.forward(224)
 t.end_fill()
 t.pensize(5)
 t.up()
 t.hideturtle()
 t.goto(0, 0)
 t.showturtle()
 t.color('#CD5C5C', 'pink')
 t.write(love, font=('gungsuh', 30), align='center')
 t.up()
 t.hideturtle()
 if me != '':
    t.color('black', 'pink')
    time.sleep(2)
 t.goto(180, -180)
 t.showturtle()
 t.write(me, font=(20,), align='center', move=True)
 window = t.Screen()
 window.exitonclick()

Result:

Part 4: Animated Beating Heart (Tkinter)

The final example creates a full‑screen animated heart using tkinter, random point generation, and a custom class to render a pulsating effect.

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

user32 = ctypes.windll.user32
CANVAS_WIDTH = user32.GetSystemMetrics(0)
CANVAS_HEIGHT = user32.GetSystemMetrics(1)
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):
    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):
    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):
    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):
    return 2 * (2 * sin(4 * p)) / (2 * pi)

class Heart:
    """Heart class"""
    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, render_canvas, render_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()
    root.attributes('-fullscreen', True)
    root.attributes('-alpha', 0.9)
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    root.mainloop()

Result (animated GIF):

These four examples let you quickly create eye‑catching heart graphics for Valentine’s Day, whether you need a simple console output, a static Turtle drawing, a personalized message, or a full‑screen animated effect.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

TkinterCode Tutorialturtle graphicsHeart AnimationValentine's Day
MaGe Linux Operations
Written by

MaGe Linux Operations

Founded in 2009, MaGe Education is a top Chinese high‑end IT training brand. Its graduates earn 12K+ RMB salaries, and the school has trained tens of thousands of students. It offers high‑pay courses in Linux cloud operations, Python full‑stack, automation, data analysis, AI, and Go high‑concurrency architecture. Thanks to quality courses and a solid reputation, it has talent partnerships with numerous internet firms.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.