if 0 {
A fuzzy clock shows approximate time only, that is, with a precision of a few minutes.
For example, for any time between 03:08 and 03:12 you would get a string like "Ten minutes past three o'clock",
There are already some programs that do that, examples are:
My fuzzy clock doesn't output a string, it highlights fixed panels with a list of words on them,
like turning on lamps inside panels which have a cover labeled with one of those words.
Some inspiration came from the following programs and pages here :
Other programs that are doing something with time:
Designers notes:
Notes about working with tcl :
Example: looking for "create text", lots of hits, but the page I want turns out to be "Tk Built-In Commands - canvas manual". And on that page, the thing I wanted is "pathName create type ...", where type can be arc, bitmap, line, rect ... and, after scrolling almost all the way down, also text.
That was not the most helpful way to present the information.
In fact, I can hardly imagine the noob that would make it so far...
For a reference-manual this might be ok, but when looking for help to get something done, this is not enough.
And examples are also very much missing in that helpfile.
I would expect links to lots of short, self-contained, working snippets of code included in such a helpfile.
}
# FuzzyClock27.tcl - Mike Hase - 2015-02-22 # http://wiki.tcl.tk/41162 package require Tk set Prog(title) "FuzzyClock" set Prog(version) "v0.6" set Prog(date) "2015-02-22" set Co(bg) grey #set bg white set bg grey set ol black set hi1 cyan set hi2 yellow set tx1 blue set tx2 white set hiC $hi1 set txC $tx1 proc makeText {w tag name rectCoords} { set id1 [$w create rect $rectCoords -tag $tag -fill $::bg -outline $::ol] foreach {x y} $rectCoords break incr x incr y set id2 [$w create text $x $y -tag t$tag -anchor w -text $name] $w addtag time withtag $tag $w addtag txt withtag t$tag # puts "$id1 $id2 : $x $y $tag $name" ;## $w scale $id1 0 0 25 15 $w scale $id2 0 0 25 15 } proc reset {tag} { foreach id [ .c find withtag time] { .c itemconfigure $id -fill $::bg } foreach id [ .c find withtag txt ] { .c itemconfigure $id -fill black } } proc hi {tag} { foreach id [ .c find withtag $tag ] { .c itemconfigure $id -fill $::hiC } foreach id [ .c find withtag t$tag ] { .c itemconfigure $id -fill $::txC } } ### Time: proc upd {} { global cs td hh ii mm am tH tM tA mTab #wm title . "$td" wm title . "$td / $ii:$mm $am" #wm title . "$ii:$mm $am" set tH "t_$ii" set tA "t_$am" #puts "$ii / $tH $tA" ;## set tM "$mm" #puts "$tM" ;## set i 0 #puts "$tM : mTab($tM) -->" foreach t $mTab($tM) { #incr i; puts " $i. $t"; hi $t if { $t=="hH" } { ;# show next hour incr ii; if { $ii>=13 } { set ii 1 } ;# max. 12 o'clock #puts "++ii: $ii" } } set tH "t_$ii" #puts "++ $tH $tA" ;## hi $tH foreach t $mTab($mm) { #incr i; puts " $i. $t" ;## hi $t } hi t_C hi $tA } proc u {} { reset time reset txt upd if { $::hiC==$::hi1 } { set ::hiC yellow } else { set ::hiC cyan } ;# change colors } ### Test+Debug: proc x {} { set ::mm "10" } proc y {} { set ::ii "12" set ::mm "02" } proc z {} { set ::mm "00" } proc h {} { incr ::ii } proc m {} { incr ::mm } proc e {} {exit} ### Time: proc now {} { global cs td hh ii mm am tH tM tA mTab set cs [clock seconds] set td [clock format $cs -format "%H:%M:%S - %l:%M %p" ] set hh [clock format $cs -format "%H" ] set ii [clock format $cs -format "%l" ] ;# %I %k %l set mm [clock format $cs -format "%M" ] set am [clock format $cs -format "%p" ] if { $am=="PM" && $hh<"18"} { set am "_" } ;# no "PM" before 18:00 incr ii; incr ii -1 ;# !! workaround !! if { $ii>=13 } { set ii 1 } ;# max. 12 o'clock puts "$hh:$mm -> $ii:$mm $am" ;## } ### proc every {ms body} { if 1 $body after $ms [list after idle [info level 0]] } proc run {} {every 10000 {now; u} } proc stop {} {foreach id [after info] {after cancel $id}; } proc sync0 {} { # wait for seconds to reach a multiple of 10 update for {set i 1} {$i<=30} {incr i} { set ::cs [clock seconds] set s0 [expr $::cs % 10] puts "$i $::cs $s0" ;## if { $s0 == 0 } { break } after 333 } } ### Fuzzyness starts here: proc start01 {w} { # setup for german fuzzyclock#1, 8x3 panels: "fünf Minuten vor halb vier Uhr" destroy $w ; pack [canvas $w -width 260 -height 260 -background grey] makeText $w t_N "Es wird" { 1 1 4 3 } makeText $w t_I "Es ist" { 4 1 7 3 } makeText $w t_W "Es war" { 7 1 10 3 } makeText $w t_v "fünf" { 1 3 4 5 } makeText $w t_x "zehn" { 4 3 7 5 } makeText $w t_M "Minuten" { 7 3 10 5 } makeText $w t_B "vor" { 1 5 4 7 } makeText $w t_P "nach" { 4 5 7 7 } makeText $w t_h "halb" { 7 5 10 7 } makeText $w t_1 "ein" { 1 7 4 9 } makeText $w t_2 "zwei" { 4 7 7 9 } makeText $w t_3 "drei" { 7 7 10 9 } makeText $w t_4 "vier" { 1 9 4 11 } makeText $w t_5 "fünf" { 4 9 7 11 } makeText $w t_6 "sechs" { 7 9 10 11 } makeText $w t_7 "sieben" { 1 11 4 13 } makeText $w t_8 "acht" { 4 11 7 13 } makeText $w t_9 "neun" { 7 11 10 13 } makeText $w t_10 "zehn" { 1 13 4 15 } makeText $w t_11 "elf" { 4 13 7 15 } makeText $w t_12 "zwölf" { 7 13 10 15 } makeText $w t_C "Uhr" { 1 15 4 17 } makeText $w t_AM "morgens" { 4 15 7 17 } makeText $w t_PM "abends" { 7 15 10 17 } array set ::mTab { 00 { t_I } 01 { t_W } 02 { t_W } 03 { t_N t_P t_v t_M } 04 { t_N t_P t_v t_M } 05 { t_I t_P t_v t_M } 06 { t_W t_P t_v t_M } 07 { t_W t_P t_v t_M } 08 { t_N t_P t_x t_M } 09 { t_N t_P t_x t_M } 10 { t_I t_P t_x t_M } 11 { t_W t_P t_x t_M } 12 { t_W t_P t_x t_M } 13 { t_N t_P t_v t_x t_M } 14 { t_N t_P t_v t_x t_M } 15 { t_I t_P t_v t_x t_M } 16 { t_W t_P t_v t_x t_M } 17 { t_W t_P t_v t_x t_M } 18 { t_N t_B t_x t_h t_M hH } 19 { t_N t_B t_x t_h t_M hH } 20 { t_I t_B t_x t_h t_M hH } 21 { t_W t_B t_x t_h t_M hH } 22 { t_W t_B t_x t_h t_M hH } 23 { t_N t_B t_v t_h t_M hH } 24 { t_N t_B t_v t_h t_M hH } 25 { t_I t_B t_v t_h t_M hH } 26 { t_W t_B t_v t_h t_M hH } 27 { t_W t_B t_v t_h t_M hH } 28 { t_N t_h hH } 29 { t_N t_h hH } 30 { t_I t_h hH } 31 { t_W t_h hH } 32 { t_W t_h hH } 33 { t_N t_P t_v t_h t_M hH } 34 { t_N t_P t_v t_h t_M hH } 35 { t_I t_P t_v t_h t_M hH } 36 { t_W t_P t_v t_h t_M hH } 37 { t_W t_P t_v t_h t_M hH } 38 { t_N t_P t_x t_h t_M hH } 39 { t_N t_P t_x t_h t_M hH } 40 { t_I t_P t_x t_h t_M hH } 41 { t_W t_P t_x t_h t_M hH } 42 { t_W t_P t_x t_h t_M hH } 43 { t_N t_B t_v t_x t_M hH } 44 { t_N t_B t_v t_x t_M hH } 45 { t_I t_B t_v t_x t_M hH } 46 { t_W t_B t_v t_x t_M hH } 47 { t_W t_B t_v t_x t_M hH } 48 { t_N t_B t_x t_M hH } 49 { t_N t_B t_x t_M hH } 50 { t_I t_B t_x t_M hH } 51 { t_W t_B t_x t_M hH } 52 { t_W t_B t_x t_M hH } 53 { t_N t_B t_v t_M hH } 54 { t_N t_B t_v t_M hH } 55 { t_I t_B t_v t_M hH } 56 { t_W t_B t_v t_M hH } 57 { t_W t_B t_v t_M hH } 58 { t_N hH } 59 { t_N hH } } ## puts $::mTab(05) } proc start02 {w} { # setup for german fuzzyclock#2, 8x3 panels: "drei Uhr fünf und zwanzig Minuten" destroy $w ; pack [canvas $w -width 260 -height 260 -background grey] makeText $w t_I "Es ist" { 1 1 4 3 } makeText $w t_AM "morgens" { 4 1 7 3 } makeText $w t_0 "null" { 7 1 10 3 } makeText $w t_1 "eins" { 1 3 4 5 } makeText $w t_2 "zwei" { 4 3 7 5 } makeText $w t_3 "drei" { 7 3 10 5 } makeText $w t_4 "vier" { 1 5 4 7 } makeText $w t_5 "fünf" { 4 5 7 7 } makeText $w t_6 "sechs" { 7 5 10 7 } makeText $w t_7 "sieben" { 1 7 4 9 } makeText $w t_8 "acht" { 4 7 7 9 } makeText $w t_9 "neun" { 7 7 10 9 } makeText $w t_10 "zehn" { 1 9 4 11 } makeText $w t_11 "elf" { 4 9 7 11 } makeText $w t_12 "zwölf" { 7 9 10 11 } makeText $w t_C "Uhr" { 1 11 4 13 } makeText $w t_v "fünf" { 4 11 7 13 } makeText $w t_x "zehn" { 7 11 10 13 } makeText $w t_+ "und" { 1 13 4 15 } makeText $w t_20 "zwanzig" { 4 13 7 15 } makeText $w t_30 "dreissig" { 7 13 10 15 } makeText $w t_40 "vierzig" { 1 15 4 17 } makeText $w t_50 "fünfzig" { 4 15 7 17 } makeText $w t_M "Minuten" { 7 15 10 17 } array set ::mTab { 00 { t_I } 01 { t_I } 02 { t_I } 03 { t_I t_v t_M } 04 { t_I t_v t_M } 05 { t_I t_v t_M } 06 { t_I t_v t_M } 07 { t_I t_v t_M } 08 { t_I t_x t_M } 09 { t_I t_x t_M } 10 { t_I t_x t_M } 11 { t_I t_x t_M } 12 { t_I t_x t_M } 13 { t_I t_v t_x t_M } 14 { t_I t_v t_x t_M } 15 { t_I t_v t_x t_M } 16 { t_I t_v t_x t_M } 17 { t_I t_v t_x t_M } 18 { t_I t_20 t_M } 19 { t_I t_20 t_M } 20 { t_I t_20 t_M } 21 { t_I t_20 t_M } 22 { t_I t_20 t_M } 23 { t_I t_v t_+ t_20 t_M } 24 { t_I t_v t_+ t_20 t_M } 25 { t_I t_v t_+ t_20 t_M } 26 { t_I t_v t_+ t_20 t_M } 27 { t_I t_v t_+ t_20 t_M } 28 { t_I t_30 t_M } 29 { t_I t_30 t_M } 30 { t_I t_30 t_M } 31 { t_I t_30 t_M } 32 { t_I t_30 t_M } 33 { t_I t_v t_+ t_30 t_M } 34 { t_I t_v t_+ t_30 t_M } 35 { t_I t_v t_+ t_30 t_M } 36 { t_I t_v t_+ t_30 t_M } 37 { t_I t_v t_+ t_30 t_M } 38 { t_I t_x t_40 t_M } 39 { t_I t_x t_40 t_M } 40 { t_I t_x t_40 t_M } 41 { t_I t_x t_40 t_M } 42 { t_I t_x t_40 t_M } 43 { t_I t_v t_+ t_40 t_M } 44 { t_I t_v t_+ t_40 t_M } 45 { t_I t_v t_+ t_40 t_M } 46 { t_I t_v t_+ t_40 t_M } 47 { t_I t_v t_+ t_40 t_M } 48 { t_I t_50 t_M } 49 { t_I t_50 t_M } 50 { t_I t_50 t_M } 51 { t_I t_50 t_M } 52 { t_I t_50 t_M } 53 { t_I t_v t_+ t_50 t_M } 54 { t_I t_v t_+ t_50 t_M } 55 { t_I t_v t_+ t_50 t_M } 56 { t_I t_v t_+ t_50 t_M } 57 { t_I t_v t_+ t_50 t_M } 58 { t_I hH } 59 { t_I hH } } .c configure -background black ## puts $::mTab(05) } set a1 { 1 1 4 3 } set b1 { 4 1 7 3 } set c1 { 7 1 10 3 } set a2 { 1 3 4 5 } set b2 { 4 3 7 5 } set c2 { 7 3 10 5 } set a3 { 1 5 4 7 } set b3 { 4 5 7 7 } set c3 { 7 5 10 7 } set a4 { 1 7 4 9 } set b4 { 4 7 7 9 } set c4 { 7 7 10 9 } set a5 { 1 9 4 11 } set b5 { 4 9 7 11 } set c5 { 7 9 10 11 } set a6 { 1 11 4 13 } set b6 { 4 11 7 13 } set c6 { 7 11 10 13 } set a7 { 1 13 4 15 } set b7 { 4 13 7 15 } set c7 { 7 13 10 15 } set a8 { 1 15 4 17 } set b8 { 4 15 7 17 } set c8 { 7 15 10 17 } proc start03 {w} { # setup for international fuzzyclock#3, 8x3 panels: "three o'clock twenty five minutes" destroy $w ; pack [canvas $w -width 260 -height 260 -background grey] #makeText $w t_I "It is" { 1 1 4 3 } makeText $w t_I "It is" $::a1 makeText $w t_AM "AM" $::b1 makeText $w t_0 "zero" $::c1 makeText $w t_1 "one" $::a2 makeText $w t_2 "two" $::b2 makeText $w t_3 "three" $::c2 makeText $w t_4 "four" $::a3 makeText $w t_5 "five" $::b3 makeText $w t_6 "six" $::c3 makeText $w t_7 "seven" $::a4 makeText $w t_8 "eight" $::b4 makeText $w t_9 "nine" $::c4 makeText $w t_10 "ten" $::a5 makeText $w t_11 "eleven" $::b5 makeText $w t_12 "twelve" $::c5 makeText $w t_C "o'clock" $::a6 makeText $w t_x "ten" $::b6 makeText $w t_15 "fifteen" $::c6 makeText $w t_20 "twenty" $::a7 makeText $w t_30 "thirty" $::b7 makeText $w t_40 "fourty" $::c7 makeText $w t_50 "fifty" $::a8 makeText $w t_v "five" $::b8 makeText $w t_M "minutes" $::c8 array set ::mTab { 00 { t_I } 01 { t_I } 02 { t_I } 03 { t_I t_v t_M } 04 { t_I t_v t_M } 05 { t_I t_v t_M } 06 { t_I t_v t_M } 07 { t_I t_v t_M } 08 { t_I t_x t_M } 09 { t_I t_x t_M } 10 { t_I t_x t_M } 11 { t_I t_x t_M } 12 { t_I t_x t_M } 13 { t_I t_15 t_M } 14 { t_I t_15 t_M } 15 { t_I t_15 t_M } 16 { t_I t_15 t_M } 17 { t_I t_15 t_M } 18 { t_I t_20 t_M } 19 { t_I t_20 t_M } 20 { t_I t_20 t_M } 21 { t_I t_20 t_M } 22 { t_I t_20 t_M } 23 { t_I t_v t_+ t_20 t_M } 24 { t_I t_v t_+ t_20 t_M } 25 { t_I t_v t_+ t_20 t_M } 26 { t_I t_v t_+ t_20 t_M } 27 { t_I t_v t_+ t_20 t_M } 28 { t_I t_30 t_M } 29 { t_I t_30 t_M } 30 { t_I t_30 t_M } 31 { t_I t_30 t_M } 32 { t_I t_30 t_M } 33 { t_I t_v t_+ t_30 t_M } 34 { t_I t_v t_+ t_30 t_M } 35 { t_I t_v t_+ t_30 t_M } 36 { t_I t_v t_+ t_30 t_M } 37 { t_I t_v t_+ t_30 t_M } 38 { t_I t_x t_40 t_M } 39 { t_I t_x t_40 t_M } 40 { t_I t_x t_40 t_M } 41 { t_I t_x t_40 t_M } 42 { t_I t_x t_40 t_M } 43 { t_I t_v t_+ t_40 t_M } 44 { t_I t_v t_+ t_40 t_M } 45 { t_I t_v t_+ t_40 t_M } 46 { t_I t_v t_+ t_40 t_M } 47 { t_I t_v t_+ t_40 t_M } 48 { t_I t_50 t_M } 49 { t_I t_50 t_M } 50 { t_I t_50 t_M } 51 { t_I t_50 t_M } 52 { t_I t_50 t_M } 53 { t_I t_v t_50 t_M } 54 { t_I t_v t_50 t_M } 55 { t_I t_v t_50 t_M } 56 { t_I t_v t_50 t_M } 57 { t_I t_v t_50 t_M } 58 { t_I hH } 59 { t_I hH } } .c configure -background blue } ### Main: #start01 .c ;#1 : german fuzzyclock: "fünf Minuten vor halb vier Uhr" #start02 .c ;#2 : german fuzzyclock: "drei Uhr fünf und zwanzig Minuten" start03 .c ;#3 : international fuzzyclock: "three o'clock twenty five minutes" bind . <F1> { console show } catch {console show} ;## catch {console hide} wm title . "$Prog(title) $Prog(version)" puts "$Prog(title) $Prog(version)" puts "tcl: $tcl_patchLevel" puts "tk : $tk_patchLevel" puts "h,m,x,y,z:change time, u:update, run, stop, e:exit" now u sync0 run ### EOF ###