import tkinter as tk, random, time
W,H=640,480
root=tk.Tk()
root.title("Sierpinski")
canvas=tk.Canvas(root,width=W,height=H,bg="black")
canvas.pack()
verts=[(W/2,20),(20,H-20),(W-20,H-20)]
for x,y in verts: canvas.create_oval(x-2,y-2,x+2,y+2,fill="white",outline="")
px,py=verts[0]
palette=["#FF6B6B","#FFD93D","#6BCB77","#4D96FF","#B86BFF"]
points_per_frame=500
t=0.0
running=True
def chaos_step(n):
    global px,py,t
    for i in range(n):
        vx,vy=random.choice(verts)
        px=(px+vx)/2.0; py=(py+vy)/2.0
        c=palette[int((px+py+t*50))%len(palette)]
        canvas.create_line(px,py,px+1,py,fill=c)
    t+=0.01
def frame():
    if running: chaos_step(points_per_frame)
    root.after(16,frame)
def reset(e=None):
    global px,py,t
    canvas.delete("all")
    for x,y in verts: canvas.create_oval(x-2,y-2,x+2,y+2,fill="white",outline="")
    px,py=verts[0]; t=0.0
def toggle(e=None):
    global running
    running=not running
root.bind("<space>",toggle); root.bind("r",reset)
root.bind("<Up>",lambda e: globals().__setitem__('points_per_frame',min(5000,globals().get('points_per_frame',500)+200)))
root.bind("<Down>",lambda e: globals().__setitem__('points_per_frame',max(10,globals().get('points_per_frame',500)-200)))
canvas.create_text(10,10,anchor="nw",fill="white",text="Space:pause  R:reset  Up/Down:speed")
frame()
root.mainloop()
