proc animate {} { set i [ expr { $::cnt % 15 } ] if {$i > 8} { set i [ expr { 15 - $i } ] } set tag t$i puts $tag .c raise bg .c raise $tag incr ::cnt after $::interval repeat } set ::cnt 0 set ::interval 200 canvas .c -width 20 -height 20 pack .c -expand 1 .c create rect 0 0 20 20 -fill gray .c create oval -5 -5 25 25 -fill gray -tags { bg } .c create oval 0 0 0 0 -fill green -tags {t0 } .c create oval 0 0 5 5 -fill green -tags { t1 } .c create oval 0 0 10 10 -fill green -tags { t2 } .c create oval 0 0 15 15 -fill green -tags { t3 } .c create oval 0 0 20 20 -fill green -tags { t4 } .c create oval 5 5 20 20 -fill green -tags { t5 } .c create oval 10 10 20 20 -fill green -tags { t6 } .c create oval 15 15 20 20 -fill green -tags { t7 } .c create oval 20 20 20 20 -fill green -tags { t8 } .c raise off update after 200 animate slightly changed to show selection by tag combinations proc animate {} { set i [ expr { $::cnt % 18 } ] ; incr ::cnt .c raise screen if {$i < 9} { set tags [ list green && step$i ] } else { set tags [ list blue && step[ expr { 17 - $i } ] ] } puts $tags .c raise $tags after $::interval repeat } set ::cnt 0 set ::interval 200 set ::coords_bg { -5 -5 25 25 } set ::coords_ball { { 0 20 2 18 } { 0 20 5 15 } { 0 20 10 10 } { 0 20 15 5 } { 0 20 20 0 } { 5 20 20 5 } { 10 20 20 10 } { 15 20 20 15 } { 18 18 20 20 } } canvas .c -width 20 -height 20 pack .c -expand 1 # create a screen to hide the nonvisible parts .c create rect $::coords_bg -fill gray -tag screen # create the animation elements foreach color {blue green} { set idx 0 foreach coord $::coords_ball { .c create oval $coord -fill $color -tags [ list $color step$idx ] incr idx } puts idx:$idx } animate ---- [EKB] That's fun!