I'll create an animated birthday cake using HTML, CSS, and JavaScript. Let me start by creating the necessary files.
The complete Python code for an animated birthday cake using tkinter:
import tkinter as tk
from tkinter import Canvas
import math
import random
import time
class AnimatedBirthdayCake:
def __init__(self, root):
self.root = root
self.root.title("Animated Birthday Cake")
self.root.geometry("800x600")
self.root.configure(bg='lightblue')
self.canvas = Canvas(root, width=800, height=600, bg='lightblue', highlightthickness=0)
self.canvas.pack()
self.candle_y = 200
self.flame_offset = 0
self.confetti_particles = []
self.animation_running = True
self.setup_cake()
self.animate()
def setup_cake(self):
# Draw cake layers
self.bottom_layer = self.canvas.create_rectangle(300, 400, 500, 500, fill='brown', outline='darkbrown', width=3)
self.middle_layer = self.canvas.create_rectangle(320, 350, 480, 400, fill='pink', outline='darkpink', width=3)
self.top_layer = self.canvas.create_rectangle(340, 300, 460, 350, fill='lightgreen', outline='darkgreen', width=3)
# Draw candle
self.candle = self.canvas.create_rectangle(395, 200, 405, 300, fill='red', outline='darkred', width=2)
# Draw flame
self.flame = self.canvas.create_oval(390, 180, 410, 220, fill='orange', outline='red', width=2)
# Draw birthday text
self.text = self.canvas.create_text(400, 100, text="Happy Birthday!", font=("Arial", 24, "bold"), fill='purple')
# Draw decorative elements
self.canvas.create_text(400, 520, text="🎉 🎂 🎉", font=("Arial", 20))
def animate_flame(self):
# Animate flame flickering
self.flame_offset += 0.3
flicker = math.sin(self.flame_offset) * 3
flame_coords = self.canvas.coords(self.flame)
new_coords = [
flame_coords[0] + flicker,
flame_coords[1],
flame_coords[2] + flicker,
flame_coords[3]
]
self.canvas.coords(self.flame, *new_coords)
# Change flame color randomly
colors = ['orange', 'yellow', 'red']
color = random.choice(colors)
self.canvas.itemconfig(self.flame, fill=color)
def create_confetti(self):
if random.random() < 0.3: # 30% chance each frame
x = random.randint(50, 750)
y = random.randint(-50, 0)
color = random.choice(['red', 'blue', 'green', 'yellow', 'purple', 'pink'])
confetti = self.canvas.create_rectangle(x, y, x+10, y+10, fill=color, outline='')
self.confetti_particles.append({
'id': confetti,
'x': x,
'y': y,
'speed': random.uniform(2, 5),
'rotation': random.uniform(0, 360),
'rotation_speed': random.uniform(-5, 5)
})
def animate_confetti(self):
for particle in self.confetti_particles[:]:
particle['y'] += particle['speed']
particle['x'] += math.sin(particle['y'] * 0.01) * 2
particle['rotation'] += particle['rotation_speed']
self.canvas.coords(particle['id'],
particle['x'], particle['y'],
particle['x'] + 10, particle['y'] + 10)
if particle['y'] > 600:
self.canvas.delete(particle['id'])
self.confetti_particles.remove(particle)
def animate_cake_bounce(self):
# Subtle cake bounce animation
bounce_offset = math.sin(time.time() * 2) * 2
# Update cake positions
self.canvas.coords(self.bottom_layer,
300, 400 + bounce_offset, 500, 500 + bounce_offset)
self.canvas.coords(self.middle_layer,
320, 350 + bounce_offset, 480, 400 + bounce_offset)
self.canvas.coords(self.top_layer,
340, 300 + bounce_offset, 460, 350 + bounce_offset)
self.canvas.coords(self.candle,
395, 200 + bounce_offset, 405, 300 + bounce_offset)
def animate_text(self):
# Animate text with pulsing effect
pulse = math.sin(time.time() * 3) * 2
current_font = self.canvas.itemcget(self.text, 'font')
font_size = int(current_font.split(',')[0].split('(')[1]) + int(pulse)
self.canvas.itemconfig(self.text, font=("Arial", font_size, "bold"))
def animate(self):
if self.animation_running:
self.animate_flame()
self.create_confetti()
self.animate_confetti()
self.animate_cake_bounce()
self.animate_text()
self.root.after(50, self.animate) # 20 FPS
def on_click(self, event):
# Create burst of confetti on click
for _ in range(20):
self.create_confetti()
def run(self):
self.canvas.bind("<Button-1>", self.on_click)
self.root.mainloop()
if __name__ == "__main__":
root = tk.Tk()
cake = AnimatedBirthdayCake(root)
cake.run()
import tkinter as tk
from tkinter import Canvas
import math
import random
import time
class AnimatedBirthdayCake:
def __init__(self, root):
self.root = root
self.root.title("Animated Birthday Cake")
self.root.geometry("800x600")
self.root.configure(bg='lightblue')
self.canvas = Canvas(root, width=800, height=600, bg='lightblue', highlightthickness=0)
self.canvas.pack()
self.candle_y = 200
self.flame_offset = 0
self.confetti_particles = []
self.animation_running = True
self.setup_cake()
self.animate()
def setup_cake(self):
# Draw cake layers
self.bottom_layer = self.canvas.create_rectangle(300, 400, 500, 500, fill='brown', outline='darkbrown', width=3)
self.middle_layer = self.canvas.create_rectangle(320, 350, 480, 400, fill='pink', outline='darkpink', width=3)
self.top_layer = self.canvas.create_rectangle(340, 300, 460, 350, fill='lightgreen', outline='darkgreen', width=3)
# Draw candle
self.candle = self.canvas.create_rectangle(395, 200, 405, 300, fill='red', outline='darkred', width=2)
# Draw flame
self.flame = self.canvas.create_oval(390, 180, 410, 220, fill='orange', outline='red', width=2)
# Draw birthday text
self.text = self.canvas.create_text(400, 100, text="Happy Birthday!", font=("Arial", 24, "bold"), fill='purple')
# Draw decorative elements
self.canvas.create_text(400, 520, text="🎉 🎂 🎉", font=("Arial", 20))
def animate_flame(self):
# Animate flame flickering
self.flame_offset += 0.3
flicker = math.sin(self.flame_offset) * 3
flame_coords = self.canvas.coords(self.flame)
new_coords = [
flame_coords[0] + flicker,
flame_coords[1],
flame_coords[2] + flicker,
flame_coords[3]
]
self.canvas.coords(self.flame, *new_coords)
# Change flame color randomly
colors = ['orange', 'yellow', 'red']
color = random.choice(colors)
self.canvas.itemconfig(self.flame, fill=color)
def create_confetti(self):
if random.random() < 0.3: # 30% chance each frame
x = random.randint(50, 750)
y = random.randint(-50, 0)
color = random.choice(['red', 'blue', 'green', 'yellow', 'purple', 'pink'])
confetti = self.canvas.create_rectangle(x, y, x+10, y+10, fill=color, outline='')
self.confetti_particles.append({
'id': confetti,
'x': x,
'y': y,
'speed': random.uniform(2, 5),
'rotation': random.uniform(0, 360),
'rotation_speed': random.uniform(-5, 5)
})
def animate_confetti(self):
for particle in self.confetti_particles[:]:
particle['y'] += particle['speed']
particle['x'] += math.sin(particle['y'] * 0.01) * 2
particle['rotation'] += particle['rotation_speed']
self.canvas.coords(particle['id'],
particle['x'], particle['y'],
particle['x'] + 10, particle['y'] + 10)
if particle['y'] > 600:
self.canvas.delete(particle['id'])
self.confetti_particles.remove(particle)
def animate_cake_bounce(self):
# Subtle cake bounce animation
bounce_offset = math.sin(time.time() * 2) * 2
# Update cake positions
self.canvas.coords(self.bottom_layer,
300, 400 + bounce_offset, 500, 500 + bounce_offset)
self.canvas.coords(self.middle_layer,
320, 350 + bounce_offset, 480, 400 + bounce_offset)
self.canvas.coords(self.top_layer,
340, 300 + bounce_offset, 460, 350 + bounce_offset)
self.canvas.coords(self.candle,
395, 200 + bounce_offset, 405, 300 + bounce_offset)
def animate_text(self):
# Animate text with pulsing effect
pulse = math.sin(time.time() * 3) * 2
current_font = self.canvas.itemcget(self.text, 'font')
font_size = int(current_font.split(',')[0].split('(')[1]) + int(pulse)
self.canvas.itemconfig(self.text, font=("Arial", font_size, "bold"))
def animate(self):
if self.animation_running:
self.animate_flame()
self.create_confetti()
self.animate_confetti()
self.animate_cake_bounce()
self.animate_text()
self.root.after(50, self.animate) # 20 FPS
def on_click(self, event):
# Create burst of confetti on click
for _ in range(20):
self.create_confetti()
def run(self):
self.canvas.bind("<Button-1>", self.on_click)
self.root.mainloop()
if __name__ == "__main__":
root = tk.Tk()
cake = AnimatedBirthdayCake(root)
cake.run()
Features:
Usage: Simply run python animated_birthday_cake.py
import tkinter as tk
from tkinter import Canvas
import math
import random
import time
import tkinter as tk
from tkinter import Canvas
import math
import random
import time
The imports are already in the code - tkinter as tk, math, random, and time.