Examples¶
Learn by example with these working code samples.
Basic Window¶
Create a simple colored window:
import window_art as wa
with wa.run():
win = wa.window(100, 100, 200, 200, color="coral")
wa.wait(3)
Animation Showcase¶
Demonstrate different easing functions:
import window_art as wa
easings = [
"linear",
"ease_out_quad",
"ease_out_cubic",
"ease_out_bounce",
"ease_out_elastic",
]
with wa.run():
windows = []
for i, ease_name in enumerate(easings):
win = wa.window(100, 100 + i * 60, 50, 50, color="coral")
windows.append((win, ease_name))
wa.wait(0.5)
# Animate each with different easing
for win, ease_name in windows:
wa.move(win, 600, win.y, duration=1.5, ease=ease_name)
wa.wait(1)
DVD Bounce¶
Classic bouncing logo effect with multiple windows:
import window_art as wa
from window_art import vec2
import random
NUM_WINDOWS = 20
COLORS = ["red", "orange", "yellow", "green", "cyan", "blue", "purple", "pink"]
with wa.run():
# Create windows with random positions and velocities
items = []
for i in range(NUM_WINDOWS):
x = random.randint(100, 800)
y = random.randint(100, 600)
color = COLORS[i % len(COLORS)]
win = wa.window(x, y, 80, 60, color=color)
vx = random.uniform(-200, 200)
vy = random.uniform(-200, 200)
items.append({"win": win, "vel": vec2(vx, vy)})
# Animate
while wa.update():
dt = wa.delta_time()
for item in items:
win = item["win"]
vel = item["vel"]
# Update position
win.x += vel.x * dt
win.y += vel.y * dt
# Bounce off edges
if win.x < 0 or win.x + win.w > 1200:
vel.x *= -1
# Change color on bounce
win.color = random.choice(COLORS)
if win.y < 0 or win.y + win.h > 800:
vel.y *= -1
win.color = random.choice(COLORS)
Color Cycling¶
Smoothly cycle through colors:
import window_art as wa
from window_art import Color
COLORS = [
Color.parse("red"),
Color.parse("orange"),
Color.parse("yellow"),
Color.parse("green"),
Color.parse("blue"),
Color.parse("purple"),
]
with wa.run():
win = wa.window(300, 200, 200, 200)
for i in range(len(COLORS) * 2): # Cycle twice
current = COLORS[i % len(COLORS)]
next_color = COLORS[(i + 1) % len(COLORS)]
# Animate through intermediate colors
for t in range(20):
win.color = current.lerp(next_color, t / 20)
wa.wait(0.05)
Parallel Animations¶
Run multiple animations simultaneously:
import window_art as wa
from functools import partial
with wa.run():
win1 = wa.window(100, 100, 100, 100, color="red")
win2 = wa.window(100, 300, 100, 100, color="blue")
win3 = wa.window(100, 500, 100, 100, color="green")
# All three move at the same time
wa.parallel(
partial(wa.move, win1, 600, 100, duration=1.5, ease="ease_out_cubic"),
partial(wa.move, win2, 600, 300, duration=1.5, ease="ease_out_bounce"),
partial(wa.move, win3, 600, 500, duration=1.5, ease="ease_out_elastic"),
)
wa.wait(1)
# All three fade out
wa.parallel(
partial(wa.fade_out, win1, duration=0.5),
partial(wa.fade_out, win2, duration=0.5),
partial(wa.fade_out, win3, duration=0.5),
)
Sequential Animations¶
Chain animations one after another:
import window_art as wa
from functools import partial
with wa.run():
win = wa.window(100, 300, 100, 100, color="coral")
wa.sequence(
partial(wa.move, win, 500, 300, duration=0.5, ease="ease_out_cubic"),
partial(wa.resize, win, 200, 200, duration=0.3, ease="ease_out_quad"),
partial(wa.color_to, win, "dodgerblue", duration=0.3),
partial(wa.fade, win, 0.5, duration=0.3),
partial(wa.move, win, 300, 200, duration=0.5, ease="ease_in_out_cubic"),
partial(wa.fade_in, win, duration=0.3),
)
wa.wait(1)
Grid Layout¶
Create a grid of colored cells:
import window_art as wa
with wa.run():
grid = wa.grid(50, 50, 600, 400,
columns="1fr 1fr 1fr",
rows="1fr 1fr",
gap=10
)
colors = ["coral", "dodgerblue", "limegreen", "gold", "hotpink", "turquoise"]
grid.fill(colors)
wa.wait(2)
# Animate grid resize
grid.animate_to(100, 100, 400, 300, duration=1.0)
wa.wait(2)
Image Display¶
Show an image in a window:
import window_art as wa
with wa.run():
win = wa.window(100, 100, 600, 400, image="photo.jpg")
wa.wait(3)
# Pan across the image
win.image_region = (0, 0, 300, 200)
wa.wait(1)
win.image_region = (300, 200, 300, 200)
wa.wait(1)
# Show full image
win.image_region = None
wa.wait(1)
GIF Animation¶
Play an animated GIF:
import window_art as wa
with wa.run():
win = wa.window(100, 100, 400, 300, gif="animation.gif")
# Play for 3 seconds
wa.wait(3)
# Slow motion
win.gif_speed = 0.5
wa.wait(3)
# Fast forward
win.gif_speed = 3.0
wa.wait(2)
# Pause and step through frames
win.gif_playing = False
for i in range(win.gif_frame_count):
win.gif_frame = i
wa.wait(0.2)
Multi-Monitor¶
Create windows on different screens:
import window_art as wa
with wa.run():
screens = wa.screens()
for i, screen in enumerate(screens):
# Center a window on each screen
cx, cy = screen.center
win = wa.window(
cx - 100, cy - 100, 200, 200,
color=["coral", "dodgerblue", "limegreen"][i % 3]
)
wa.wait(5)
Staggered Animation¶
Animate windows with delays:
import window_art as wa
with wa.run():
windows = []
for i in range(10):
win = wa.window(100, 50 + i * 70, 50, 50, color="coral", opacity=0)
windows.append(win)
# Staggered fade in
for i, win in enumerate(windows):
wa.wait(0.1) # Delay between each
wa.fade_in(win, duration=0.3)
wa.wait(1)
# Staggered move
for i, win in enumerate(windows):
wa.move(win, 600, win.y, duration=0.5, ease="ease_out_cubic")
# No wait - next one starts immediately
Circular Motion¶
Move windows in a circle:
import window_art as wa
from window_art import vec2
import math
with wa.run():
center = vec2(400, 300)
radius = 150
num_windows = 8
windows = []
for i in range(num_windows):
angle = (i / num_windows) * math.pi * 2
pos = center + vec2.from_angle(angle, radius)
win = wa.window(pos.x - 25, pos.y - 25, 50, 50, color="coral")
windows.append((win, angle))
# Rotate
start_time = wa.get_time()
while wa.update():
elapsed = wa.get_time() - start_time
if elapsed > 5: # Run for 5 seconds
break
for win, base_angle in windows:
angle = base_angle + elapsed * 2 # 2 radians per second
pos = center + vec2.from_angle(angle, radius)
win.position = (pos.x - 25, pos.y - 25)
Window Following Mouse¶
A window that follows cursor movement (requires reading mouse position):
import window_art as wa
# Note: This example requires additional SDL2 bindings for mouse input
# This is a simplified version using manual position updates
with wa.run():
follower = wa.window(400, 300, 50, 50, color="coral")
# Simulate mouse movement with animation
positions = [(200, 200), (600, 200), (600, 500), (200, 500), (400, 350)]
for x, y in positions:
wa.move(follower, x - 25, y - 25, duration=0.5, ease="ease_out_cubic")
wa.wait(1)
More Examples¶
The examples/ directory in the repository contains additional examples:
Clone the repository to run these examples: