Keith Vetter : 2010-07-22 : Here's yet another clock, this one a bit different in that it highlights English phrases to describe the time. It's based on Simon Heys' linear word clock screen saver [L1 ].
It uses English phrases but it wouldn't be hard to extend it to other languages, I just don't know other languages well enough to do it.

package require Tk
# Here's the original color scheme
array set S {
foreground gray50 background black font "Ariel 20 bold"
onforeground red onbackground black onfont "Ariel 20 bold"}
# Here's a more vivid color scheme
array set S {
foreground gray50 background black
onforeground black onbackground magenta}
proc DoDisplay {} {
wm title . "Word Clock by Keith Vetter"
text .t -wrap word -width 70 -height 19 -font "Ariel 20 bold" \
-bg $::S(background)
pack .t -fill both -expand 1
foreach who {h s} {
foreach item $::all($who) {
set tag $who,[string map {" " ""} $item]
.t tag configure $tag -foreground gray50 -font $::S(font)
.t insert end $item $tag
.t insert end " "
}
}
set ::on {}
}
proc ShowTime {h m s} {
foreach tag $::on {
.t tag configure $tag -foreground $::S(foreground) \
-background $::S(background) -font $::S(font)
}
set ::on {}
set english [Time2English $h $m $s]
set preTag h
foreach item $english {
if {$item eq "and" || $item eq "exactly"} { set preTag "s" }
set tag $preTag,[string map {" " ""} $item]
.t tag configure $tag -foreground $::S(onforeground) \
-background $::S(onbackground) -font $::S(onfont)
lappend ::on $tag
}
}
proc Ticker {} {
foreach aid [after info] { after cancel $aid }
set a [clock format [clock seconds] -format "%l %M %S"]
scan $a "%d %d %d" h m s
ShowTime $h $m $s
after 1000 Ticker
}
# Display text broken into a hour/minute part and a seconds part
set all(h) {"Five past" "Ten past" "Quarter past" "Twenty past"
"Twenty-five past"
"Half past" "Twenty-five to" "Twenty to" "Quarter to" "Ten to" "Five to"
One one Two two Three three Four four Five five Six six Seven seven
Eight eight Nine nine Ten ten Eleven Twelve "o'clock"
oh-one oh-two oh-three oh-four oh-five oh-six oh-seven oh-eight oh-nine
eleven twelve
thirteen fourteen sixteen seventeen eighteen nineteen
twenty-one twenty-two twenty-three twenty-four
twenty-six twenty-seven twenty-eight twenty-nine
thirty-one thirty-two thirty-three thirty-four
thirty-six thirty-seven thirty-eight thirty-nine
forty-one forty-two forty-three forty-four
forty-six forty-seven forty-eight forty-nine
fifty-one fifty-two fifty-three fifty-four
fifty-six fifty-seven fifty-eight fifty-nine}
set all(s) {and exactly "one second" two three four five six seven eight nine ten
eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen
twenty twenty-one twenty-two twenty-three twenty-four twenty-five
twenty-six twenty-seven twenty-eight twenty-nine
thirty thirty-one thirty-two thirty-three thirty-four thirty-five
thirty-six thirty-seven thirty-eight thirty-nine
forty forty-one forty-two forty-three forty-four forty-five
forty-six forty-seven forty-eight forty-nine
fifty fifty-one fifty-two fifty-three fifty-four fifty-five
fifty-six fifty-seven fifty-eight fifty-nine seconds
}
array set PAST {5 "five past" 10 "ten past" 15 "quarter past"
20 "twenty past" 25 "twenty-five past" 30 "half past"}
array set TO {35 "twenty-five to" 40 "twenty to" 45 "quarter to"
50 "ten to" 55 "five to"
}
set WordNumbers {- one two three four five six seven eight nine ten eleven
twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen
twenty twenty-one twenty-two twenty-three twenty-four twenty-five
twenty-six twenty-seven twenty-eight twenty-nine
thirty thirty-one thirty-two thirty-three thirty-four thirty-five
thirty-six thirty-seven thirty-eight thirty-nine
forty forty-one forty-two forty-three forty-four forty-five
forty-six forty-seven forty-eight forty-nine
fifty fifty-one fifty-two fifty-three fifty-four fifty-five
fifty-six fifty-seven fifty-eight fifty-nine
}
proc Time2English {hour minute second} {
set english {}
if {$minute == 0} {
set english [list [lindex $::WordNumbers $hour] "o'clock"]
} elseif {[info exists ::PAST($minute)]} {
lappend english $::PAST($minute)
lappend english [lindex $::WordNumbers $hour]
} elseif {[info exists ::TO($minute)]} {
lappend english $::TO($minute)
incr hour
if {$hour == 13} {set hour 1}
lappend english [lindex $::WordNumbers $hour]
} elseif {$minute < 10} {
lappend english [lindex $::WordNumbers $hour]
lappend english "oh-[lindex $::WordNumbers $minute]"
} else {
lappend english [lindex $::WordNumbers $hour]
lappend english [lindex $::WordNumbers $minute]
}
if {$second == 0} {
lappend english "exactly"
} elseif {$second == 1} {
lappend english "and" "one second"
} else {
lappend english "and" [lindex $::WordNumbers $second] "seconds"
}
lset english 0 [string totitle [lindex $english 0]]
return $english
}
DoDisplay
Ticker
returnHoMi-(2010-07-23) There was a little bug, the setting of the TO array was wrong (missing 'array' before the word 'set').