if 0 {<
>
[Richard Suchenwirth] 2003-02-19 - More than a month after we discussed it in the [Tcl chatroom], here comes a little traffic light simulator, which might interest children: both to play with a bit, and see how it was done, especially the "states" section below (state machines are child's play!) - which models the behavior of German traffic lights.
[WikiDbImage traffic.jpg]
Change phase by clicking on the button, or . Turning on the timer makes lights automatically change every second. Feel free to modify it! (In Austria I think they have a yellow+green phase between green and yellow ...)
[AM] A few remarks:
* There are several Wiki pages that use traffic lights as an example.
* If you combine this graphics with any of the other techniques, like the one in [Playing CLIPS] to add support for specific countries, this might be an amusing little subject for an educational project
}
----
package require Tk
proc light args {
.c itemconfig light -fill black
foreach i $args {.c itemconfig $i -fill $i}
}
proc next what {
if $::timer {
after 1000 $what
} else {set ::next $what}
}
#------------------- the states:
proc red {} {
light red; next red+yellow
}
proc red+yellow {} {
light red yellow; next green
}
proc green {} {
light green; next yellow
}
proc yellow {} {
light yellow; next red
}
#----------- Graphical User Interface:
pack [canvas .c -width 120 -height 100]
.c create rect 5 5 35 85 -fill gray20
.c create oval 10 10 30 30 -tags {red light}
.c create oval 10 35 30 55 -tags {yellow light}
.c create oval 10 60 30 80 -tags {green light}
checkbutton .c.t -text Timer -variable timer
set timer 0
.c create window 50 50 -window .c.t -anchor w
button .c.b -text Next -command {eval $next}
.c create window 50 70 -window .c.b -anchor w
bind . {eval $next}
red ;# initial state
----
See also: [Street-crossing with Traffic-Lights]
----
!!!!!!
[Arts and crafts of Tcl-Tk programming]
%|[Category Toys]|%
!!!!!!