Traffic lights

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 <Return>. 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 . <Return> {eval $next}
 red ;# initial state

See also