JM Nov 7th 2010, This little toy resembles the key rings that contains a "perpetual calendar", of course we can create such calendar with clock commands, but this time, the objective was to re-create the mechanical shifts of labels on such key rings. you can add more years to this little toy as long as you add them in groups of 7.
On the other hand, it was a good excuse to play with lists and grid commands.
the screenshot above shows the november 2010 calendar, where I underlined today's date 11/28, sunday.
#console show
set wkDays [list mon tue wed thu fri sat sun]
set years [list 2018 2017 2016* ---- 2015 2014 2013\
2012* ---- 2011 2010 2009 2008* ----\
2007 2006 2005 2004* ---- 2003 2002\
2001 2000* ---- 1999 1998 1997 1996*\
---- 1995 1994 1993 1992* ---- 1991\
1990 1989 1988* ---- 1987 1986 1985\
1984* ---- 1983 1982 1981 1980* ----\
1979 1978 1977 1976* ---- 1975 1974\
1973 1972* ---- 1971 1970 1969 1968*]
proc refresh {wkDays years} {
foreach widget {.lblUno .lblDos .lblTres .lblCuatro .lblCinco .lblSeis .lblSiete} valor $wkDays {
$widget configure -text $valor
}
foreach widget {.yr1 .yr2 .yr3 .yr4 .yr5 .yr6 .yr7} valor [lrange $years 0 6] {
$widget configure -text $valor
}
}
proc shift3 {_L} {
upvar 1 $_L L
set L [concat [lindex $L end] [lrange $L 0 end-1]]
}
proc shift4 {_L} {
upvar 1 $_L L
set L [concat [lrange $L 1 end] [lindex $L 0]]
#puts $L
}
proc shift> {} {
global wkDays years
shift3 years
shift4 wkDays
refresh $wkDays $years
}
proc shift< {} {
global wkDays years
shift3 wkDays
shift4 years
refresh $wkDays $years
}
label .title -text "Perpetual Calendar"
grid .title -columnspan 9
button .btn> -text ">" -command shift>
button .btn< -text "<" -command shift<
for {set i 1} {$i < 8} {incr i} {
label .yr$i -text "1234"
}
grid .btn< .yr1 .yr2 .yr3 .yr4 .yr5 .yr6 .yr7 .btn>
foreach month {Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec} {
label .lbl$month -text $month
}
label .lblEneB -text "Jan" -bg yellow
label .lblFebB -text "Feb" -bg yellow
grid x .lblEne .lblMay .lblAgo .lblMar .lblJun .lblDic .lblJul
grid x .lblOct x .lblFebB .lblFeb x .lblSep .lblAbr
grid x x x x .lblNov x x .lblEneB
for {set i 1} {$i < 32} {incr i} {
label .lbl$i -text "$i"
}
foreach dia {Uno Dos Tres Cuatro Cinco Seis Siete} {
label .lbl$dia -text $dia
}
grid x .lblUno .lblDos .lblTres .lblCuatro .lblCinco .lblSeis .lblSiete
grid x .lbl1 .lbl2 .lbl3 .lbl4 .lbl5 .lbl6 .lbl7
grid x .lbl8 .lbl9 .lbl10 .lbl11 .lbl12 .lbl13 .lbl14
grid x .lbl15 .lbl16 .lbl17 .lbl18 .lbl19 .lbl20 .lbl21
grid x .lbl22 .lbl23 .lbl24 .lbl25 .lbl26 .lbl27 .lbl28
grid x .lbl29 .lbl30 .lbl31
for {set i 0} {$i < 9} {incr i} {
grid columnconfigure . $i -minsize 50
}
refresh $wkDays $years