Загрузка данных


import turtle
import math
import random
import time

# =========================
# НАСТРОЙКИ ОКНА
# =========================

screen = turtle.Screen()
screen.setup(1000, 750)
screen.bgcolor("#08000f")
screen.title("For Karina ❤️")
screen.tracer(0)

# =========================
# ФУНКЦИЯ СЕРДЦА
# =========================

def heart(t, scale=20):
    x = 16 * math.sin(t) ** 3
    y = (
        13 * math.cos(t)
        - 5 * math.cos(2 * t)
        - 2 * math.cos(3 * t)
        - math.cos(4 * t)
    )

    return x * scale, y * scale


# =========================
# ЗВЁЗДЫ НА ФОНЕ
# =========================

stars = []

for i in range(80):
    star = turtle.Turtle()
    star.hideturtle()
    star.penup()

    x = random.randint(-480, 480)
    y = random.randint(-350, 350)

    star.goto(x, y)
    star.color("#ffffff")

    size = random.randint(2, 5)

    star.write(
        "•",
        align="center",
        font=("Arial", size, "bold")
    )

    stars.append(star)

screen.update()

# =========================
# РИСОВАНИЕ СЕРДЦА
# =========================

heart_pen = turtle.Turtle()
heart_pen.hideturtle()
heart_pen.speed(0)
heart_pen.pensize(5)
heart_pen.color("#ff2b70")

x, y = heart(0)

heart_pen.penup()
heart_pen.goto(x, y)
heart_pen.pendown()

steps = 600

for i in range(steps + 1):

    t = 2 * math.pi * i / steps

    x, y = heart(t)

    heart_pen.goto(x, y)

    if i % 3 == 0:
        screen.update()
        time.sleep(0.008)


# =========================
# СВЕЧЕНИЕ СЕРДЦА
# =========================

glow = turtle.Turtle()
glow.hideturtle()
glow.speed(0)

for size, color in [
    (10, "#ff0055"),
    (7, "#ff2975"),
    (4, "#ff72a0")
]:

    glow.penup()

    points = 180

    for i in range(points + 1):

        t = 2 * math.pi * i / points

        x, y = heart(t, size / 20 * 20)

        if i == 0:
            glow.goto(x, y)
            glow.pendown()
        else:
            glow.goto(x, y)

    glow.penup()
    glow.color(color)
    screen.update()
    time.sleep(0.15)


# =========================
# ПЛАВНОЕ ПОЯВЛЕНИЕ ТЕКСТА
# =========================

text = "I love you Karina"

writer = turtle.Turtle()
writer.hideturtle()
writer.penup()

# Эффект свечения
for i in range(8):

    writer.clear()

    writer.goto(0, -30)

    # Чем дальше, тем ярче
    colors = [
        "#350010",
        "#550018",
        "#750025",
        "#990033",
        "#bb0045",
        "#dd155c",
        "#f53678",
        "#ffffff"
    ]

    writer.color(colors[i])

    writer.write(
        text,
        align="center",
        font=("Arial", 32, "bold")
    )

    screen.update()
    time.sleep(0.15)


# =========================
# ЛЕТАЮЩИЕ СЕРДЕЧКИ
# =========================

small_hearts = []

for i in range(18):

    h = turtle.Turtle()
    h.hideturtle()
    h.penup()

    h.x = random.randint(-450, 450)
    h.y = random.randint(-300, 300)

    h.goto(h.x, h.y)

    h.color(
        random.choice([
            "#ff2b70",
            "#ff4f88",
            "#ff79a3",
            "#ffb3c9"
        ])
    )

    h.write(
        "♥",
        align="center",
        font=("Arial", random.randint(12, 25), "bold")
    )

    small_hearts.append(h)

screen.update()


# =========================
# ФИНАЛЬНАЯ АНИМАЦИЯ
# =========================

for frame in range(40):

    for h in small_hearts:

        x = h.x
        y = h.y + frame * 1.5

        h.goto(x, y)

    screen.update()
    time.sleep(0.04)


# =========================
# ФИНАЛЬНАЯ НАДПИСЬ
# =========================

writer.clear()

writer.goto(0, -30)
writer.color("#ffffff")

writer.write(
    "I love you Karina",
    align="center",
    font=("Arial", 34, "bold")
)

screen.update()

turtle.done()