Version 4 of Animations on a Canvas

Updated 2005-05-02 13:29:25 by lwv

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!


Category Example Category GUI