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.
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.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
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.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
