Page contents
General Notes edit
MiHa 2015-02-24 - 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:- https://extensions.gnome.org/extension/202/fuzzy-clock/ - human-readable clock for the gnome-shell panel
- http://code.google.com/p/fuzzyclock/ - A fuzzy clock (à la KDE) for the Windows tray
- http://home.gna.org/fuzzyclock/ - A python class and commandline utility to generate a "fuzzy clock" output.
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 :
- Enter and Leave Event Bindings
- WorldtimeClock
- Refrigerator_Pinyin_Poetry
- after
- every
- argv
- Spider Solitaire - help (as in 'proc showRules')
Designers notes edit
- I use 3*8 rectangles as "panels" on a canvas
- Each such area has a word (like "ten", "minutes", "before"),
and tags for adressing. - The current time gets read with "clock format clock seconds",
- this "raw time" gets displayed at the top of the window (for testing),
- and then I use a table-lookup to figure out which panels to light up.
- This table has an entry for each minute of the hour, with a list of tags.
- (When implemening this in hardware, I would instead use 32bit-values,
where each bit represents one of the panels) - Actually, this whole thing works like one of those decoders for a 7-segment-display,
just with more "segments", and better configurable. - The clock is a 12-hour design, but instead of AM/PM, I use morning/evening,
where "morning" behaves like AM, but "evening" only starts at 18:00. - With "It is"/"It gets"/"It was", my time is fuzzy/precise within two minutes,
- so I limited the update-frequency to once every 10 seconds..
- My choice of words went towards "five" and "ten",
which can in german both be lit to be nicely combined to get the equivalent of "fifteen".
For a proper english fuzzy clock, you might want "quarter" as a separate word. - In hindsight, for designing and changing the layout, it is easier
to have an addressing scheme for the panels like for cells in a spreadsheet. - Some procedure-names were choosen to be short for easy testing/calling from console.
Notes about working with tcl edit
This section has been moved to my personal page here.Program edit
}
# FuzzyClock89.tcl - Mike Hase - 2015-02-24 / 2015-06-19 # http://wiki.tcl.tk/41162 package require Tk set Prog(Title) "FuzzyClock" set Prog(Version) "v1.29" set Prog(Date) "2015-06-19" set Prog(Author) "Mike Hase" set Prog(Contact) "Mike.Hase@nospam.com" set Prog(HomePage) "http://wiki.tcl.tk/41162" set Prog(Options) "" set Prog(About) {FuzzyClock: a textual clock that shows approximate time (rounded to 5 minutes) by highlighting panels with fixed text. In various layouts (german and international), including ship's clock and "Glasenuhr". } set scX 12 ### Colortable: (ToDo) 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 ### Display: proc makeText {w tag name rectCoords} { # Create a panel with some text inside (e.g. "one", or "o'clock"). # The name of the panel is the same as the text. # The panel and the text are assigned tags, that will later be used # to turn that panel+text on or off (i.e. change their colors). global scX 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 $scX 15 $w scale $id2 0 0 $scX 15 } proc turnOff {tag} { foreach id [ .c find withtag time] { .c itemconfigure $id -fill $::bg } foreach id [ .c find withtag txt ] { .c itemconfigure $id -fill black } } proc turnOn {tag} { foreach id [ .c find withtag $tag ] { .c itemconfigure $id -fill $::hiC } foreach id [ .c find withtag t$tag ] { .c itemconfigure $id -fill $::txC } } ### Update display / highlight panels: proc upd_fc {} { ;# update for fuzzyclock # Find out which hour to show (e.g. 09:45 --> "quarter to ten o'clock" ) # # In the minute-table, look at the entry for the current minute, # from there get the list of tags, # and turn on all panels listed. global cs td hh ii mm am wd tH tM tA mTab ;#-sTab 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"; turnOn $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" ;## turnOn $tH foreach t $mTab($mm) { #incr i; puts " $i. $t" ;## turnOn $t } turnOn t_C turnOn $tA } proc upd_sc {} { ;# update for shipclock # Instead of hours, we have "watches" and "glasses", # and one glass runs 30 minutes. global cs td hh ii mm am wd tH tM tA sTab ;#-mTab ### Demo/Test for ship's bell: #turnOn t_gI; turnOn t_HN; turnOn t_g2 set shiptags "t_gI " set ww [watch $hh $mm] set W $sTab($ww) #puts "ww $ww : $W ==>" ;## foreach t $W { #incr i; puts " $i. $t" ;## turnOn $t } set gg [bells $ii $mm] puts "Ship: $hh h $mm m => watch $ww, $gg glasen/bells" ;## append shiptags "t_g$gg " #puts "$cs> $hh $ii : $mm - $wd" ;## # Special significance on ships: sunday and noon if { $::wd == 0 } { append shiptags "t_Su " } if { $::hh==12 && $::mm== 0 } { append shiptags "t_HN " } set mm3 [s2i $mm] if {$mm3>=30} {incr mm3 -30} set gm 0 # find nearest matching minute-entry in sTab: for {set m 0} {$m<30} {incr m} { if { [info exists sTab($m)] } { set gm $m } #puts ".. $m -> $gm" ;## if {$m>=$mm3} {break} } #puts "!! $mm $m -> <<$sTab($gm)>> $gm" append shiptags $sTab($gm) puts "$hh:$mm $mm3 $gm ---> $shiptags " ;## set i 0 foreach t $shiptags { #incr i; puts "Ship: $i. $t" ;## turnOn $t } } proc upd {} { # Update the text showing the time in the window-bar, and the panels. global cs td hh ii mm am wd #wm title . "$td" #wm title . "$td / $ii:$mm $am" wm title . "($::fc) $td / $ii:$mm $am" # use only one of the tables: mTab sTab if {$::fc in [list G1 G2 SG1 SG2 SB1 SB2]} { ;# Multi-IF upd_sc } else { upd_fc } } proc u {} { ;# do everything related to display-update turnOff time turnOff txt upd if { $::hiC==$::hi1 } { set ::hiC yellow } \ else { set ::hiC cyan } ;# change colors / ToDo: colortable } ### Test+Debug: proc ? {} { help } proc help {} { puts "argv0 : $::argv0" puts "argv : $::argv" puts "tcl/tk: $::tcl_patchLevel / $::tk_patchLevel" puts "t0,t1,h,m,x,y:change time, u:update, run,stop, p,p1,p2,pp:pos, bg:color, e:exit" } # Note: testing might be easier by changing the system-clock (forward only!). proc t {} { t0 } #proc t_ {} { set ::cs [clock scan {2015-03-13 23:55:00} -format {%Y-%m-%d %H:%M:%S}] } proc t1 {} { set ::cs [clock scan {00:16:00} -format {%H:%M:%S}]; timecodes } proc t2 {} { set ::cs [clock scan {09:55:00} -format {%H:%M:%S}]; timecodes } proc x {} { set ::mm "10" } proc y {} { set ::ii "12"; set ::mm "02" } proc h {} { incr ::ii } proc m {} { incr ::mm } # screen+color / find window for active console: proc bg { {c HotPink} } { .c configure -background $c; #wm deiconify . } # screen+position: proc p {} { puts "wm geom . : [wm geom .]" } proc pp {} { wm geom . +740+20; wm deiconify . ; p } proc p1 {} { wm geom . +1+1; wm deiconify . ; p } proc p2 {} { wm geom . +740+1; wm deiconify . ; p } proc e {} { exit } ### Misc / Utility: proc s2i {s} { ;# string-to-int / convert values from [clock seconds] to integer ##puts ">>>$s<<<" # Some ways to convert strings to integer, but fail for "08" and "09" : #incr s 0 #set i $s #format %u $s if { $s == "08" } { set s " 8" } ;# !! workaround !! if { $s == "09" } { set s " 9" } set i [expr {$s}] } proc c1 {s} { set c [string range $s 0 0 ] } ;# return first char of string proc c2 {s} { set c [string range $s 0 1 ] } ;# return first 2 chars proc c9 {s} { set c [string range $s end end ] } ;# return last char # tcl::mathop::[in] comes with tcl 8.5, see [TIP 201]. # For users of earlier versions: #proc in {list el} {expr [lsearch -exact $list $el] >= 0} ;# Multi-IF ### Ship's bell: proc b1 {} { bell } proc b2 {} { bell; after 250; bell; after 400 } proc ringbell { {b 1} } { puts "RingBell>>>$b<<< mm=$::mm sound=$::sound\n" ;## if { $::sound == 0 } { return } if { $::sound == 1 } { if { $::mm == "00"} { bell } return } # sound==2 : Ship's bell: while { $b>=2 } { b2; incr b -2 } while { $b>=1 } { b1; incr b -1 } } proc watch {hh mm} { # determine watch for a given hour set ww 0 #if { $hh=="00" || $hh=="01" || $hh=="02" || $hh=="03" } { set ww "w0" } ## Multi-IF if {$hh in [list 00 01 02 03]} { set ww "w0" } if {$hh in [list 04 05 06 07]} { set ww "w1" } if {$hh in [list 08 09 10 11]} { set ww "w2" } if {$hh in [list 12 13 14 15]} { set ww "w3" } if {$hh in [list 16 17 18 19]} { set ww "w4" } if {$hh in [list 20 21 22 23]} { set ww "w5" } #puts "watch>>>$hh:$mm>> $ww" ;## return $ww } proc bells {hh mm} { # determine bells for a given time set bb 0 set hh [s2i $hh] #if { $hh== 1 || $hh== 5 || $hh== 9 } { set bb 2 } ## Multi-IF if {$hh in [list 1 5 9]} { set bb 2 } if {$hh in [list 2 6 10]} { set bb 4 } if {$hh in [list 3 7 11]} { set bb 6 } if {$hh in [list 4 8 12]} { set bb 8 } if { $mm >= 30 } { incr bb } if { $bb >= 9 } { set bb 1 } ;# max. 8 bells/glasen #puts "bells>>>$hh:$mm>>$bb" ;## return $bb } ### Time: proc t0 {} { ;# Set cs to current time # To use some fixed time (for testing) use proc t1, t2 etc. set ::cs [clock seconds] timecodes } proc timecodes {} { # Set all variables that depend on the "current" time from cs global cs td hh ii mm am wd tH tM tA mTab 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 ss [clock format $cs -format "%S" ] set am [clock format $cs -format "%p" ] set wd [clock format $cs -format "%w" ] ;# 0=Sunday if { $am=="PM" && $hh<"18"} { set am "_" } ;# no "PM" before 18:00 set ii [s2i $ii] if { $ii>=13 } { set ii 1 } ;# max. 12 o'clock if { $hh== 0 } { set de0 [c2 $::fc] if { $de0 == "DE" } { set ii 0 ;# Germany: after midnight, use 0 o'clock } } puts "$hh:$mm:$ss -> $ii:$mm $am" ;## set s1 [c1 $ss] if { $mm=="00" && $s1=="0"} { ringbell [bells $ii $mm] } if { $mm=="30" && $s1=="0"} { ringbell [bells $ii $mm] } } ### Time/Repeat/Wait: proc every {ms body} { if 1 $body after $ms [list after idle [info level 0]] } proc stop {} { foreach id [after info] {after cancel $id}; } proc run {} { run2 } proc run2 {} { $::time; timecodes; u; sync2 } proc sync2 {} { # adjust time for re-scheduling, to get closer to a time # with the seconds at a multiple of 10. #set ::cs [clock seconds] set s0 [expr $::cs % 10] if { $s0 == 0 } { after 10000 run2; #puts "sync2: $::td $::cs $s0 #==ok==" ;## } else { after 9000 run2; #puts "sync2: $::td $::cs $s0 #++adjust++" ;## } } #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+ ### Menu: proc m+ {head name {cmd ""}} { #: Menu-creator "m+" by R.Suchenwirth and DKF, 2006-08-24, see http://wiki.tcl.tk/16327 # Uses the undocumented and unsupported feature ::tk::UnderlineAmpersand if {![winfo exists .m.m$head]} { foreach {l u} [::tk::UnderlineAmpersand $head] break .m add cascade -label $l -underline $u -menu [menu .m.m$head -tearoff 0] } if {[regexp ^-+$ $name]} { .m.m$head add separator } else { foreach {l u} [::tk::UnderlineAmpersand $name] break .m.m$head add command -label $l -underline $u -comm $cmd } } #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+ ### GUI: proc menuOnOff {} { if { [winfo exists .m] } { destroy .m } else { initMenu } } proc initMenu {} { # Define menu . configure -menu [menu .m] # m+ &File &Open { Dummy "Open" } # m+ &File &Save { Dummy "Save" } # m+ &File ----- m+ &File &Exit exit # V,H,Q: uses the terms "Viertel", "Halb"/"Half", "Quarter" in telling the time # "-": 5-minute precison only, "...": Todo # ":": uses "it was"/"it is"/it gets" for increased precision m+ &Fuzzy "&German: 8x3 H" { start DE1 } m+ &Fuzzy "DE&2 - 8x3 (common)" { start DE2 } m+ &Fuzzy "DE&3 : 8x3 V" { start DE3 } m+ &Fuzzy "DE&4 : 8x3 V" { start DE4 } m+ &Fuzzy "DE&5 - 5x5" { start DE5 } m+ &Fuzzy "DE&6 - 6x4" { start DE6 } m+ &Fuzzy "DE&7 - 4x6" { start DE7 } m+ &Fuzzy "DE&8 : 6x5 24h" { start DE8 } m+ &Fuzzy ----- m+ &Fuzzy "&Glasenuhr - 8x3" { start SG1 } m+ &Fuzzy "G&2 - 3x8 wide" { start SG2 } m+ &Fuzzy ----- m+ &Fuzzy "&International - 8x3" { start I1 } m+ &Fuzzy "I&2 - 8x3 Q" { start I2 } m+ &Fuzzy "I&3...6x5 24h " { start I3 } m+ &Fuzzy ----- m+ &Fuzzy "&Ship's Bell - 8x3" { start SB1 } m+ &Fuzzy "SB&2 - 3x8 wide" { start SB2 } m+ &Clock "&Stop" { stop } m+ &Clock "T&0 - Current time" { t0 } m+ &Clock "T&1" { t1 } m+ &Clock "T&2" { t2 } m+ &Clock "&Update" { u } m+ &Help &About Help0 m+ &Help &Help Help1 m+ &Help ----- m+ &Help &Debug { console show } m+ &Help "&Menu off" { destroy .m } } proc initKeys {} { # Define bindings for hotkeys bind all <Key-F1> Help1 bind all <Key-F2> { console show } bind all <Key-F3> menuOnOff bind all <Key-F4> exit bind all <Escape> { exit } bind all <Key-F5> { start DE2 } bind all <Key-F6> { start DE7 } bind all <Key-F7> { start I1 } bind all <Key-F8> { start I2 } bind all <Key-F9> { start SG1 } bind all <Key-F10> { start SB2 } } #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+ proc start { x } { # Show and run a fresh fuzzyclock, # after stopping any old ones. set ::fc "$x" stop start_$x .c ;# start_DE1 .c update help $::time ;# t0 after 250 u run2 } #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+ proc Dummy {txt} { #: Alert: "Function X not implemented yet" bell tk_messageBox -icon warning -title "Demo" \ -message "Function '$txt' not implemented yet." } proc Help0 {} { #: Short info about the program / using tk_messageBox global Prog set txt "$Prog(Title) $Prog(Version) - " append txt "$Prog(Date)\nby $Prog(Author) - $Prog(Contact)\n\n$Prog(About)" tk_messageBox -icon info -message $txt -title "About $Prog(Title) $Prog(Version)" } proc Help1 {} { ;# from: Spider Solitaire - Help global Prog set w .help if { [winfo exists $w] } { wm deiconify $w raise $w focus $w return; } toplevel $w wm title $w "$Prog(Title) - Help" frame $w.f text $w.f.t -wrap word scrollbar $w.f.sb $w.f.t configure -yscrollcommand "$w.f.sb set" $w.f.sb configure -command "$w.f.t yview" $w.f.t tag configure h1 -font {{} 18 bold } -justify center -foreground red $w.f.t tag configure h2 -font {{} 8 italic} -justify center $w.f.t tag configure h3 -font {{} 12 bold } -foreground red $w.f.t tag configure h4 -font {{} 10 bold } -foreground blue $w.f.t insert end "$Prog(Title)\n" h1 $w.f.t insert end "Version $Prog(Version) - $Prog(Date)\n\n" h2 $w.f.t insert end "$Prog(Title) is a textual digital clock that shows approximate time\n" $w.f.t insert end "(rounded to 5 minutes) by highlighting panels with fixed text.\n\n" $w.f.t insert end "The program provides various layouts (german and international),\n" $w.f.t insert end "including ship's clock and \"Glasenuhr\".\n\n" $w.f.t insert end "Fuzzy LAYOUTS:\n" h3 $w.f.t insert end "German layouts:\n" h4 $w.f.t insert end "* DE1 - 8x3, 12hour clock using 'halb' (='half').\n" $w.f.t insert end "* DE2 - 8x3\n" $w.f.t insert end "* DE3 - 8x3, using 'Viertel' (='Quarter').\n" $w.f.t insert end "* DE4 - 8x3, using 'Viertel' (='Quarter').\n" $w.f.t insert end "* DE5 - 5x5 \n" $w.f.t insert end "* DE6 - 6x4 \n" $w.f.t insert end "* DE7 - 4x6 \n" $w.f.t insert end "* DE8 - 6x5, 24h-clock.\n\n" $w.f.t insert end "International layouts:\n" h4 $w.f.t insert end "* I1 - 8x3, 12hour AM/PM.\n" $w.f.t insert end "* I2 - 8x3, using 'quarter before/past'.\n" $w.f.t insert end "* I3 - 6x5, 24h-clock.\n\n" $w.f.t insert end "Ship's bell and Glasenuhr:\n" h4 $w.f.t insert end "* SB1 - Ship's bell, 8x3.\n" $w.f.t insert end "* SB2 - Ship's bell, 3x8 wide layout.\n" $w.f.t insert end "* SG1 - Glasenuhr, 8x3.\n" $w.f.t insert end "* SG2 - Glasenuhr, 3x8 wide layout.\n\n" $w.f.t insert end "CLOCK:\n" h3 $w.f.t insert end "This is useful for testing, comparing layouts, and doing screenshots.\n" $w.f.t insert end "* Stop : stop the updating of the clock.\n" $w.f.t insert end " To restart it, (re-)select any layout.\n" $w.f.t insert end "* T0 : set the clock's time to the current time.\n" $w.f.t insert end "* T1 : set to fixed time #1 (see 'proc t1')\n" $w.f.t insert end "* T2 : set to fixed time #2\n" $w.f.t insert end "* Update: update the display after changing the time.\n\n" $w.f.t insert end "HOTKEYS:\n" h3 $w.f.t insert end "* F1 - Show this help.\n* F2 - Activate Debug/Console.\n" $w.f.t insert end "* F3 - Switch menu on/off.\n" $w.f.t insert end "* F4, Esc - Exit program.\n" $w.f.t insert end "* F5,F6 - Select german layouts.\n" $w.f.t insert end "* F7,F8 - Select international layouts.\n" $w.f.t insert end "* F9,F10 - Select ship's bell and Glasenuhr.\n\n" $w.f.t insert end "DEBUG:\n" h3 $w.f.t insert end " The console offers access to the program's internals and variables.\n\n" $w.f.t insert end "Commands:\n" h4 $w.f.t insert end " ?: show console-help, e: Exit program.\n\n" $w.f.t insert end " M : create new menu.\n" $w.f.t insert end " bg : set background-color (eg. 'bg red').\n" $w.f.t insert end " p : show size and position of the program-window.\n" $w.f.t insert end " p1,p2,pp : set program-window to some position (see 'proc p1' etc.).\n\n" $w.f.t insert end " stop, run: stop updating the clock / continue display-updates.\n" $w.f.t insert end " t0, t1,t2: set clock to current time / predefined times (see 'proc t1' etc.).\n" $w.f.t insert end " h,m,x,y: change clock.\n" $w.f.t insert end " u: update the clock-display.\n\n" $w.f.t insert end "You can enter any tcl-command in the console, for example:\n" $w.f.t insert end "% info proc\n" $w.f.t insert end "% info var\n" $w.f.t insert end "% winfo geom .\n" $w.f.t insert end "% puts \$cs\n" $w.f.t insert end "% parray mTab\n" $w.f.t insert end "% set time t2\n" $w.f.t insert end "\n" $w.f.t insert end "CREDITS:\n" h3 $w.f.t insert end " Written by $Prog(Author) ($Prog(Contact)),\n source at $Prog(HomePage).\n" $w.f.t configure -state disabled pack $w.f -side top -expand 1 -fill both pack $w.f.t -side left -expand 1 -fill both pack $w.f.sb -side right -fill y frame $w.f2 pack $w.f2 -side top -pady 8 button $w.f2.b -text "Close" -command "wm withdraw $w" -width 9 pack $w.f2.b wm protocol $w WM_DELETE_WINDOW "wm withdraw $w" focus $w.f.t };# Help1 proc _Help1 {} { Dummy Help1 } #---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+ ### Positions, spreadsheet-style: # see also scale ## 8x3: 8 rows * 3 cols / "tall": set a1 { 1 1 8 3 } set b1 { 8 1 14 3 } set c1 { 14 1 21 3 } set a2 { 1 3 8 5 } set b2 { 8 3 14 5 } set c2 { 14 3 21 5 } set a3 { 1 5 8 7 } set b3 { 8 5 14 7 } set c3 { 14 5 21 7 } set a4 { 1 7 8 9 } set b4 { 8 7 14 9 } set c4 { 14 7 21 9 } set a5 { 1 9 8 11 } set b5 { 8 9 14 11 } set c5 { 14 9 21 11 } set a6 { 1 11 8 13 } set b6 { 8 11 14 13 } set c6 { 14 11 21 13 } set a7 { 1 13 8 15 } set b7 { 8 13 14 15 } set c7 { 14 13 21 15 } set a8 { 1 15 8 17 } set b8 { 8 15 14 17 } set c8 { 14 15 21 17 } ## 3x8: 3 rows * 8 cols / "wide": set x1 { 1 1 8 3 } set x2 { 8 1 16 3 } set x3 { 16 1 24 3 } set x4 { 24 1 32 3 } set x5 { 32 1 40 3 } set x6 { 40 1 48 3 } set x7 { 48 1 56 3 } set x8 { 56 1 64 3 } set y1 { 1 3 8 5 } set y2 { 8 3 16 5 } set y3 { 16 3 24 5 } set y4 { 24 3 32 5 } set y5 { 32 3 40 5 } set y6 { 40 3 48 5 } set y7 { 48 3 56 5 } set y8 { 56 3 64 5 } set z1 { 1 5 8 7 } set z2 { 8 5 16 7 } set z3 { 16 5 24 7 } set z4 { 24 5 32 7 } set z5 { 32 5 40 7 } set z6 { 40 5 48 7 } set z7 { 48 5 56 7 } set z8 { 56 5 64 7 } ## 6x4: 4 rows * 6 cols / "wide": set d1 { 1 1 8 3 } set d2 { 8 1 16 3 } set d3 { 16 1 24 3 } set d4 { 24 1 32 3 } set d5 { 32 1 40 3 } set d6 { 40 1 48 3 } set e1 { 1 3 8 5 } set e2 { 8 3 16 5 } set e3 { 16 3 24 5 } set e4 { 24 3 32 5 } set e5 { 32 3 40 5 } set e6 { 40 3 48 5 } set f1 { 1 5 8 7 } set f2 { 8 5 16 7 } set f3 { 16 5 24 7 } set f4 { 24 5 32 7 } set f5 { 32 5 40 7 } set f6 { 40 5 48 7 } set g1 { 1 7 8 9 } set g2 { 8 7 16 9 } set g3 { 16 7 24 9 } set g4 { 24 7 32 9 } set g5 { 32 7 40 9 } set g6 { 40 7 48 9 } ## 4x6: 6 rows * 4 cols / "tall": set m1 { 1 1 8 3 } set m2 { 8 1 16 3 } set m3 { 16 1 24 3 } set m4 { 24 1 32 3 } set n1 { 1 3 8 5 } set n2 { 8 3 16 5 } set n3 { 16 3 24 5 } set n4 { 24 3 32 5 } set o1 { 1 5 8 7 } set o2 { 8 5 16 7 } set o3 { 16 5 24 7 } set o4 { 24 5 32 7 } set p1 { 1 7 8 9 } set p2 { 8 7 16 9 } set p3 { 16 7 24 9 } set p4 { 24 7 32 9 } set q1 { 1 9 8 11 } set q2 { 8 9 16 11 } set q3 { 16 9 24 11 } set q4 { 24 9 32 11 } set r1 { 1 11 8 13 } set r2 { 8 11 16 13 } set r3 { 16 11 24 13 } set r4 { 24 11 32 13 } ## 5x5: 5 rows * 5 cols : set q11 { 1 1 8 3 } set q12 { 8 1 16 3 } set q13 { 16 1 24 3 } set q14 { 24 1 32 3 } set q15 { 32 1 40 3 } set q21 { 1 3 8 5 } set q22 { 8 3 16 5 } set q23 { 16 3 24 5 } set q24 { 24 3 32 5 } set q25 { 32 3 40 5 } set q31 { 1 5 8 7 } set q32 { 8 5 16 7 } set q33 { 16 5 24 7 } set q34 { 24 5 32 7 } set q35 { 32 5 40 7 } set q41 { 1 7 8 9 } set q42 { 8 7 16 9 } set q43 { 16 7 24 9 } set q44 { 24 7 32 9 } set q45 { 32 7 40 9 } set q51 { 1 9 8 11 } set q52 { 8 9 16 11 } set q53 { 16 9 24 11 } set q54 { 24 9 32 11 } set q55 { 32 9 40 11 } ## + 6x5: 6 rows * 5 cols : set q61 { 1 11 8 13 } set q62 { 8 11 16 13 } set q63 { 16 11 24 13 } set q64 { 24 11 32 13 } set q65 { 32 11 40 13 } ### Fuzzyness starts here: # Each of the following start_XXX - procedures defines # one of the the layouts for a fuzzyclock: # * Scale scX: to adjust panel-size for text-length # * Background-color, # * Position on screen: for the "showcase" # * All panels to be used: text, position and tags. # * Minute-table: has one entry for each minute of the hour, # with a list of tags/panels to highlight at that time. proc start_DE1 {w} { puts "setup for german fuzzyclock#DE1" # 8x3 panels: "fünf Minuten vor halb vier Uhr" destroy $w; pack [canvas $w -width 200 -height 260 -background grey] set ::scX 9 if { $::pos < 0 } { wm geom . +50+15 } #makeText $w t_N "Es wird" { 1 1 4 3 } makeText $w t_N "Es wird" $::a1 makeText $w t_I "Es ist" $::b1 makeText $w t_W "Es war" $::c1 makeText $w t_v "fünf" $::a2 makeText $w t_x "zehn" $::b2 makeText $w t_M "Minuten" $::c2 makeText $w t_B "vor" $::a3 makeText $w t_P "nach" $::b3 makeText $w t_h "halb" $::c3 makeText $w t_0 "null" $::a4 makeText $w t_1 "ein" $::b4 makeText $w t_2 "zwei" $::c4 makeText $w t_3 "drei" $::a5 makeText $w t_4 "vier" $::b5 makeText $w t_5 "fünf" $::c5 makeText $w t_6 "sechs" $::a6 makeText $w t_7 "sieben" $::b6 makeText $w t_8 "acht" $::c6 makeText $w t_9 "neun" $::a7 makeText $w t_10 "zehn" $::b7 makeText $w t_11 "elf" $::c7 makeText $w t_12 "zwölf" $::a8 makeText $w t_C "Uhr" $::b8 makeText $w t_AM "morgens" $::c8 #makeText $w t_PM "abends" $::c8 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 } } .c configure -background DarkGreen ##puts $::mTab(05) } proc start_DE2 {w} { puts "setup for german fuzzyclock#DE2" # 8x3 panels: "drei Uhr fünf und zwanzig Minuten" destroy $w; pack [canvas $w -width 200 -height 260 -background gray22] set ::scX 9 if { $::pos < 0 } { wm geom . +275+15 } makeText $w t_I "Es ist" $::a1 makeText $w t_AM "morgens" $::b1 makeText $w t_0 "null" $::c1 makeText $w t_1 "ein" $::a2 makeText $w t_2 "zwei" $::b2 makeText $w t_3 "drei" $::c2 makeText $w t_4 "vier" $::a3 makeText $w t_5 "fünf" $::b3 makeText $w t_6 "sechs" $::c3 makeText $w t_7 "sieben" $::a4 makeText $w t_8 "acht" $::b4 makeText $w t_9 "neun" $::c4 makeText $w t_10 "zehn" $::a5 makeText $w t_11 "elf" $::b5 makeText $w t_12 "zwölf" $::c5 makeText $w t_C "Uhr" $::a6 makeText $w t_v "fünf" $::b6 makeText $w t_x "zehn" $::c6 makeText $w t_+ "und" $::a7 makeText $w t_xx "zwanzig" $::b7 makeText $w t_30 "dreissig" $::c7 makeText $w t_40 "vierzig" $::a8 makeText $w t_50 "fünfzig" $::b8 makeText $w t_M "Minuten" $::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_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_+ t_xx t_M } 19 { t_I t_+ t_xx t_M } 20 { t_I t_+ t_xx t_M } 21 { t_I t_+ t_xx t_M } 22 { t_I t_+ t_xx t_M } 23 { t_I t_v t_+ t_xx t_M } 24 { t_I t_v t_+ t_xx t_M } 25 { t_I t_v t_+ t_xx t_M } 26 { t_I t_v t_+ t_xx t_M } 27 { t_I t_v t_+ t_xx t_M } 28 { t_I t_+ t_30 t_M } 29 { t_I t_+ t_30 t_M } 30 { t_I t_+ t_30 t_M } 31 { t_I t_+ t_30 t_M } 32 { t_I t_+ 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_+ t_40 t_M } 39 { t_I t_+ t_40 t_M } 40 { t_I t_+ t_40 t_M } 41 { t_I t_+ t_40 t_M } 42 { t_I t_+ 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_+ t_50 t_M } 49 { t_I t_+ t_50 t_M } 50 { t_I t_+ t_50 t_M } 51 { t_I t_+ t_50 t_M } 52 { t_I t_+ 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 ForestGreen } proc start_DE3 {w} { puts "setup for german fuzzyclock#DE3" # 8x3 panels: "morgens viertel nach elf" destroy $w; pack [canvas $w -width 205 -height 260 -background gray33] set ::scX 9.5 if { $::pos < 0 } { wm geom . +500+15 } makeText $w t_N "Es wird" $::a1 makeText $w t_I "Es ist" $::b1 makeText $w t_W "Es war" $::c1 makeText $w t_AM "morgens" $::a2 makeText $w t_PM "abends" $::b2 makeText $w t_v "fünf" $::c2 makeText $w t_x "zehn" $::a3 #makeText $w t_M "Minuten" $::b3 makeText $w t_q "viertel" $::b3 makeText $w t_B "vor" $::c3 makeText $w t_P "nach" $::a4 makeText $w t_h "halb" $::b4 makeText $w t_0 "null Uhr" $::c4 makeText $w t_1 "ein Uhr" $::a5 makeText $w t_2 "zwei Uhr" $::b5 makeText $w t_3 "drei Uhr" $::c5 makeText $w t_4 "vier Uhr" $::a6 makeText $w t_5 "fünf Uhr" $::b6 makeText $w t_6 "sechs Uhr" $::c6 makeText $w t_7 "sieben Uhr" $::a7 makeText $w t_8 "acht Uhr" $::b7 makeText $w t_9 "neun Uhr" $::c7 makeText $w t_10 "zehn Uhr" $::a8 makeText $w t_11 "elf Uhr" $::b8 makeText $w t_12 "zwölf Uhr" $::c8 #makeText $w t_C_ "Uhr" $::c9 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_q t_M } 14 { t_N t_P t_q t_M } 15 { t_I t_P t_q t_M } 16 { t_W t_P t_q t_M } 17 { t_W t_P t_q 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_q t_M hH } 44 { t_N t_B t_q t_M hH } 45 { t_I t_B t_q t_M hH } 46 { t_W t_B t_q t_M hH } 47 { t_W t_B t_q 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 } } .c configure -background PaleGreen4 } proc start_DE4 {w} { puts "setup for german fuzzyclock#DE4" # 8x3 panels: "morgens viertel nach elf Uhr" destroy $w; pack [canvas $w -width 175 -height 260 -background gray44] set ::scX 8 if { $::pos < 0 } { wm geom . +725+15 } makeText $w t_N "Es wird" $::a1 makeText $w t_I "Es ist" $::b1 makeText $w t_W "Es war" $::c1 makeText $w t_AM "morgens" $::a2 makeText $w t_v "fünf" $::b2 makeText $w t_x "zehn" $::c2 makeText $w t_q "viertel" $::a3 makeText $w t_B "vor" $::b3 makeText $w t_P "nach" $::c3 makeText $w t_h "halb" $::a4 makeText $w t_0 "null" $::b4 makeText $w t_1 "ein" $::c4 makeText $w t_2 "zwei" $::a5 makeText $w t_3 "drei" $::b5 makeText $w t_4 "vier" $::c5 makeText $w t_5 "fünf" $::a6 makeText $w t_6 "sechs" $::b6 makeText $w t_7 "sieben" $::c6 makeText $w t_8 "acht" $::a7 makeText $w t_9 "neun" $::b7 makeText $w t_10 "zehn" $::c7 makeText $w t_11 "elf" $::a8 makeText $w t_12 "zwölf" $::b8 makeText $w t_C "Uhr" $::c8 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_q t_M } 14 { t_N t_P t_q t_M } 15 { t_I t_P t_q t_M } 16 { t_W t_P t_q t_M } 17 { t_W t_P t_q 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_q t_M hH } 44 { t_N t_B t_q t_M hH } 45 { t_I t_B t_q t_M hH } 46 { t_W t_B t_q t_M hH } 47 { t_W t_B t_q 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 } } .c configure -background SeaGreen4 } proc start_DE5 {w} { puts "setup for german fuzzyclock#DE2->DE5" # 5x5 panels: "drei Uhr fünf und zwanzig Minuten" #destroy $w; pack [canvas $w -width 200 -height 260 -background gray22] destroy $w; pack [canvas $w -width 288 -height 170 -background gray25] set ::scX 7.1 if { $::pos < 0 } { wm geom . +50+310 } makeText $w t_I "Es ist" $::q11 makeText $w t_AM "morgens" $::q12 makeText $w t_0 "null" $::q13 makeText $w t_1 "ein" $::q14 makeText $w t_2 "zwei" $::q15 makeText $w t_3 "drei" $::q21 makeText $w t_4 "vier" $::q22 makeText $w t_5 "fünf" $::q23 makeText $w t_6 "sechs" $::q24 makeText $w t_7 "sieben" $::q25 makeText $w t_8 "acht" $::q31 makeText $w t_9 "neun" $::q32 makeText $w t_10 "zehn" $::q33 makeText $w t_11 "elf" $::q34 makeText $w t_12 "zwölf" $::q35 makeText $w t_C "Uhr" $::q41 makeText $w t_+ "und" $::q42 makeText $w t_v "fünf" $::q43 makeText $w t_x "zehn" $::q44 makeText $w t_++ "und" $::q45 makeText $w t_xx "zwanzig" $::q51 makeText $w t_30 "dreissig" $::q52 makeText $w t_40 "vierzig" $::q53 makeText $w t_50 "fünfzig" $::q54 makeText $w t_M "Minuten" $::q55 array set ::mTab { 00 { t_I } 01 { t_I } 02 { t_I } 03 { t_I t_+ t_v t_M } 04 { t_I t_+ t_v t_M } 05 { t_I t_+ t_v t_M } 06 { t_I t_+ t_v t_M } 07 { t_I t_+ t_v t_M } 08 { t_I t_+ t_x t_M } 09 { t_I t_+ t_x t_M } 10 { t_I t_+ t_x t_M } 11 { t_I t_+ t_x t_M } 12 { t_I t_+ t_x t_M } 13 { t_I t_+ t_v t_x t_M } 14 { t_I t_+ t_v t_x t_M } 15 { t_I t_+ t_v t_x t_M } 16 { t_I t_+ t_v t_x t_M } 17 { t_I t_+ t_v t_x t_M } 18 { t_I t_+ t_xx t_M } 19 { t_I t_+ t_xx t_M } 20 { t_I t_+ t_xx t_M } 21 { t_I t_+ t_xx t_M } 22 { t_I t_+ t_xx t_M } 23 { t_I t_+ t_v t_++ t_xx t_M } 24 { t_I t_+ t_v t_++ t_xx t_M } 25 { t_I t_+ t_v t_++ t_xx t_M } 26 { t_I t_+ t_v t_++ t_xx t_M } 27 { t_I t_+ t_v t_++ t_xx t_M } 28 { t_I t_+ t_30 t_M } 29 { t_I t_+ t_30 t_M } 30 { t_I t_+ t_30 t_M } 31 { t_I t_+ t_30 t_M } 32 { t_I t_+ t_30 t_M } 33 { t_I t_+ t_v t_++ t_30 t_M } 34 { t_I t_+ t_v t_++ t_30 t_M } 35 { t_I t_+ t_v t_++ t_30 t_M } 36 { t_I t_+ t_v t_++ t_30 t_M } 37 { t_I t_+ t_v t_++ t_30 t_M } 38 { t_I t_+ t_40 t_M } 39 { t_I t_+ t_40 t_M } 40 { t_I t_+ t_40 t_M } 41 { t_I t_+ t_40 t_M } 42 { t_I t_+ t_40 t_M } 43 { t_I t_+ t_v t_++ t_40 t_M } 44 { t_I t_+ t_v t_++ t_40 t_M } 45 { t_I t_+ t_v t_++ t_40 t_M } 46 { t_I t_+ t_v t_++ t_40 t_M } 47 { t_I t_+ t_v t_++ t_40 t_M } 48 { t_I t_+ t_50 t_M } 49 { t_I t_+ t_50 t_M } 50 { t_I t_+ t_50 t_M } 51 { t_I t_+ t_50 t_M } 52 { t_I t_+ t_50 t_M } 53 { t_I t_+ t_v t_++ t_50 t_M } 54 { t_I t_+ t_v t_++ t_50 t_M } 55 { t_I t_+ t_v t_++ t_50 t_M } 56 { t_I t_+ t_v t_++ t_50 t_M } 57 { t_I t_+ t_v t_++ t_50 t_M } 58 { t_I hH } 59 { t_I hH } } .c configure -background PaleGreen ;#ForestGreen } proc start_DE6 {w} { puts "setup for german fuzzyclock#DE2->DE6" # 6x4 panels: "drei Uhr fünf und zwanzig Minuten" #destroy $w; pack [canvas $w -width 200 -height 260 -background gray22] destroy $w; pack [canvas $w -width 320 -height 140 -background gray61] set ::scX 6.5 if { $::pos < 0 } { wm geom . +50+530 } makeText $w t_I "Es ist" $::d1 makeText $w t_AM "morgens" $::d2 makeText $w t_0 "null" $::d3 makeText $w t_1 "ein" $::d4 makeText $w t_2 "zwei" $::d5 makeText $w t_3 "drei" $::d6 makeText $w t_4 "vier" $::e1 makeText $w t_5 "fünf" $::e2 makeText $w t_6 "sechs" $::e3 makeText $w t_7 "sieben" $::e4 makeText $w t_8 "acht" $::e5 makeText $w t_9 "neun" $::e6 makeText $w t_10 "zehn" $::f1 makeText $w t_11 "elf" $::f2 makeText $w t_12 "zwölf" $::f3 makeText $w t_C "Uhr" $::f4 makeText $w t_v "fünf" $::f5 makeText $w t_x "zehn" $::f6 makeText $w t_+ "und" $::g1 makeText $w t_xx "zwanzig" $::g2 makeText $w t_30 "dreissig" $::g3 makeText $w t_40 "vierzig" $::g4 makeText $w t_50 "fünfzig" $::g5 makeText $w t_M "Minuten" $::g6 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_+ t_xx t_M } 19 { t_I t_+ t_xx t_M } 20 { t_I t_+ t_xx t_M } 21 { t_I t_+ t_xx t_M } 22 { t_I t_+ t_xx t_M } 23 { t_I t_v t_+ t_xx t_M } 24 { t_I t_v t_+ t_xx t_M } 25 { t_I t_v t_+ t_xx t_M } 26 { t_I t_v t_+ t_xx t_M } 27 { t_I t_v t_+ t_xx t_M } 28 { t_I t_+ t_30 t_M } 29 { t_I t_+ t_30 t_M } 30 { t_I t_+ t_30 t_M } 31 { t_I t_+ t_30 t_M } 32 { t_I t_+ 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_+ t_40 t_M } 39 { t_I t_+ t_40 t_M } 40 { t_I t_+ t_40 t_M } 41 { t_I t_+ t_40 t_M } 42 { t_I t_+ 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_+ t_50 t_M } 49 { t_I t_+ t_50 t_M } 50 { t_I t_+ t_50 t_M } 51 { t_I t_+ t_50 t_M } 52 { t_I t_+ 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 Green ;# ForestGreen } proc start_DE7 {w} { puts "setup for german fuzzyclock#DE2->DE6/DE7" # 4x6 panels: "drei Uhr fünf und zwanzig Minuten" #destroy $w; pack [canvas $w -width 200 -height 260 -background gray22] destroy $w; pack [canvas $w -width 240 -height 200 -background gray67] set ::scX 7.3 if { $::pos < 0 } { wm geom . +360+310 } makeText $w t_I "Es ist" $::m1 makeText $w t_AM "morgens" $::m2 makeText $w t_0 "null" $::m3 makeText $w t_1 "ein" $::m4 makeText $w t_2 "zwei" $::n1 makeText $w t_3 "drei" $::n2 makeText $w t_4 "vier" $::n3 makeText $w t_5 "fünf" $::n4 makeText $w t_6 "sechs" $::o1 makeText $w t_7 "sieben" $::o2 makeText $w t_8 "acht" $::o3 makeText $w t_9 "neun" $::o4 makeText $w t_10 "zehn" $::p1 makeText $w t_11 "elf" $::p2 makeText $w t_12 "zwölf" $::p3 makeText $w t_C "Uhr" $::p4 makeText $w t_v "fünf" $::q1 makeText $w t_x "zehn" $::q2 makeText $w t_+ "und" $::q3 makeText $w t_xx "zwanzig" $::q4 makeText $w t_30 "dreissig" $::r1 makeText $w t_40 "vierzig" $::r2 makeText $w t_50 "fünfzig" $::r3 makeText $w t_M "Minuten" $::r4 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_+ t_xx t_M } 19 { t_I t_+ t_xx t_M } 20 { t_I t_+ t_xx t_M } 21 { t_I t_+ t_xx t_M } 22 { t_I t_+ t_xx t_M } 23 { t_I t_v t_+ t_xx t_M } 24 { t_I t_v t_+ t_xx t_M } 25 { t_I t_v t_+ t_xx t_M } 26 { t_I t_v t_+ t_xx t_M } 27 { t_I t_v t_+ t_xx t_M } 28 { t_I t_+ t_30 t_M } 29 { t_I t_+ t_30 t_M } 30 { t_I t_+ t_30 t_M } 31 { t_I t_+ t_30 t_M } 32 { t_I t_+ 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_+ t_40 t_M } 39 { t_I t_+ t_40 t_M } 40 { t_I t_+ t_40 t_M } 41 { t_I t_+ t_40 t_M } 42 { t_I t_+ 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_+ t_50 t_M } 49 { t_I t_+ t_50 t_M } 50 { t_I t_+ t_50 t_M } 51 { t_I t_+ t_50 t_M } 52 { t_I t_+ 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 Green1 ;# ForestGreen } proc start_DE8 {w} { puts "setup for german 24h fuzzyclock#DE2->DE5->DE8" # ToDo ... } ### proc start_I1 {w} { puts "setup for international fuzzyclock#1" # 8x3 panels: "three o'clock twenty five minutes" destroy $w; pack [canvas $w -width 175 -height 260 -background gray11] set ::scX 8 if { $::pos < 0 } { wm geom . +620+310 } 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_xv "fifteen" $::c6 makeText $w t_xx "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_xv t_M } 14 { t_I t_xv t_M } 15 { t_I t_xv t_M } 16 { t_I t_xv t_M } 17 { t_I t_xv t_M } 18 { t_I t_xx t_M } 19 { t_I t_xx t_M } 20 { t_I t_xx t_M } 21 { t_I t_xx t_M } 22 { t_I t_xx t_M } 23 { t_I t_v t_+ t_xx t_M } 24 { t_I t_v t_+ t_xx t_M } 25 { t_I t_v t_+ t_xx t_M } 26 { t_I t_v t_+ t_xx t_M } 27 { t_I t_v t_+ t_xx 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_40 t_M } 39 { t_I t_40 t_M } 40 { t_I t_40 t_M } 41 { t_I t_40 t_M } 42 { t_I 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 FireBrick ;# maroon } proc start_I2 {w} { puts "setup for international fuzzyclock#2" # 8x3 panels: "quarter past three o'clock" destroy $w; pack [canvas $w -width 175 -height 260 -background grey12] set ::scX 8 if { $::pos < 0 } { wm geom . +820+310 } makeText $w t_I "It is" $::a1 makeText $w t_AM "AM" $::b1 makeText $w t_x "ten" $::c1 makeText $w t_q "a quarter" $::a2 makeText $w t_xx "twenty" $::b2 makeText $w t_h "half" $::c2 makeText $w t_v "five" $::a3 makeText $w t_M "minutes" $::b3 makeText $w t_B "before" $::c3 makeText $w t_P "past" $::a4 makeText $w t_0 "zero" $::b4 makeText $w t_1 "one" $::c4 makeText $w t_2 "two" $::a5 makeText $w t_3 "three" $::b5 makeText $w t_4 "four" $::c5 makeText $w t_5 "five" $::a6 makeText $w t_6 "six" $::b6 makeText $w t_7 "seven" $::c6 makeText $w t_8 "eight" $::a7 makeText $w t_9 "nine" $::b7 makeText $w t_10 "ten" $::c7 makeText $w t_11 "eleven" $::a8 makeText $w t_12 "twelve" $::b8 makeText $w t_C "o'clock" $::c8 array set ::mTab { 00 { t_I } 01 { t_I } 02 { t_I } 03 { t_I t_P t_v t_M } 04 { t_I t_P t_v t_M } 05 { t_I t_P t_v t_M } 06 { t_I t_P t_v t_M } 07 { t_I t_P t_v t_M } 08 { t_I t_P t_x t_M } 09 { t_I t_P t_x t_M } 10 { t_I t_P t_x t_M } 11 { t_I t_P t_x t_M } 12 { t_I t_P t_x t_M } 13 { t_I t_P t_q t_ } 14 { t_I t_P t_q t_ } 15 { t_I t_P t_q t_ } 16 { t_I t_P t_q t_ } 17 { t_I t_P t_q t_ } 18 { t_I t_P t_xx t_M } 19 { t_I t_P t_xx t_M } 20 { t_I t_P t_xx t_M } 21 { t_I t_P t_xx t_M } 22 { t_I t_P t_xx t_M } 23 { t_I t_P t_v t_xx t_M } 24 { t_I t_P t_v t_xx t_M } 25 { t_I t_P t_v t_xx t_M } 26 { t_I t_P t_v t_xx t_M } 27 { t_I t_P t_v t_xx t_M } 28 { t_I t_h t_P } 29 { t_I t_h t_P } 30 { t_I t_h t_P } 31 { t_I t_h t_P } 32 { t_I t_h t_P } 33 { t_I t_B t_v t_xx t_M hH } 34 { t_I t_B t_v t_xx t_M hH } 35 { t_I t_B t_v t_xx t_M hH } 36 { t_I t_B t_v t_xx t_M hH } 37 { t_I t_B t_v t_xx t_M hH } 38 { t_I t_B t_xx t_M hH } 39 { t_I t_B t_xx t_M hH } 40 { t_I t_B t_xx t_M hH } 41 { t_I t_B t_xx t_M hH } 42 { t_I t_B t_xx t_M hH } 43 { t_I t_B t_q t_ hH } 44 { t_I t_B t_q t_ hH } 45 { t_I t_B t_q t_ hH } 46 { t_I t_B t_q t_ hH } 47 { t_I t_B t_q t_ hH } 48 { t_I t_B t_x t_M hH } 49 { t_I t_B t_x t_M hH } 50 { t_I t_B t_x t_M hH } 51 { t_I t_B t_x t_M hH } 52 { t_I t_B t_x t_M hH } 53 { t_I t_B t_v t_M hH } 54 { t_I t_B t_v t_M hH } 55 { t_I t_B t_v t_M hH } 56 { t_I t_B t_v t_M hH } 57 { t_I t_B t_v t_M hH } 58 { t_I hH } 59 { t_I hH } } .c configure -background Red4 ;# OrangeRed4 } proc start_I3 {w} { Dummy start_I3 } ;# International 24h ### ### ### proc start_SG1 {w} { puts "G1: setup for german fuzzy shipclock / glasen" # 8x3 panels - tall: "zweite Tagwache drei Glasen und fünf und zwanzig Minuten" destroy $w; pack [canvas $w -width 270 -height 260 -background gray70] set ::scX 12.5 if { $::pos < 0 } { wm geom . +50+15 } makeText $w t_gI "Es ist" $::a1 makeText $w t_Su "Sonntag" $::b1 makeText $w t_HN "Mittag" $::c1 makeText $w t_w1 "erste" $::a2 ;# 04:00 makeText $w t_w2 "zweite" $::b2 ;# 08:00 makeText $w t_w3 "dritte" $::c2 ;# 12:00 makeText $w t_w4 "vierte" $::a3 ;# 16:00 makeText $w t_dw "Tagwache" $::b3 makeText $w t_nw "Nachtwache" $::c3 ;# 20:00 / 00:00 makeText $w t_g1 "ein Glasen" $::a4 makeText $w t_g2 "zwei Glasen" $::b4 makeText $w t_g3 "drei Glasen" $::c4 makeText $w t_g4 "vier Glasen" $::a5 makeText $w t_g5 "fünf Glasen" $::b5 makeText $w t_g6 "sechs Glasen" $::c5 makeText $w t_g7 "sieben Glasen" $::a6 makeText $w t_g8 "acht Glasen" $::b6 #makeText $w t_G "Glasen" $::c6 makeText $w t_+1 "und" $::a7 makeText $w t_gv "fünf" $::b7 makeText $w t_gx "zehn" $::c7 makeText $w t_+2 "und" $::a8 makeText $w t_gz "zwanzig" $::b8 makeText $w t_gM "Minuten" $::c8 ## see also: proc upd array set ::sTab { w1 { t_w1 t_dw } w2 { t_w2 t_dw } w3 { t_w3 t_dw } w4 { t_w4 t_dw } w5 { t_w1 t_nw } w0 { t_w2 t_nw } 0 {} 5 { t_+1 t_gv t_gM } 10 { t_+1 t_gx t_gM } 15 { t_+1 t_gv t_gx t_gM } 20 { t_+1 t_gz t_gM } 25 { t_+1 t_gv t_+2 t_gz t_gM } } .c configure -background blue2 ;# MediumBlue blue4 } proc start_SG2 {w} { puts "G2: setup for german fuzzy shipclock / glasen" # 3x8 panels - wide: "zweite Tagwache drei Glasen und fünf und zwanzig Minuten" global x1 x2 x3 x4 x5 x6 x7 x8 y1 y2 y3 y4 y5 y6 y7 y8 z1 z2 z3 z4 z5 z6 z7 z8 destroy $w; pack [canvas $w -width 615 -height 110 -background gray80] set ::scX 9.6 if { $::pos < 0 } { wm geom . +340+15 } makeText $w t_gI "Es ist" $::x1 makeText $w t_Su "Sonntag" $x2 makeText $w t_HN "Mittag" $z1 makeText $w t_w1 "erste" $x3 ;# 04:00 makeText $w t_w2 "zweite" $x4 ;# 08:00 makeText $w t_w3 "dritte" $x5 ;# 12:00 makeText $w t_w4 "vierte" $x6 ;# 16:00 makeText $w t_dw "Tagwache" $x7 makeText $w t_nw "Nachtwache" $x8 ;# 20:00 / 00:00 makeText $w t_g1 "ein Glasen" $y1 makeText $w t_g2 "zwei Glasen" $y2 makeText $w t_g3 "drei Glasen" $y3 makeText $w t_g4 "vier Glasen" $y4 makeText $w t_g5 "fünf Glasen" $y5 makeText $w t_g6 "sechs Glasen" $y6 makeText $w t_g7 "sieben Glasen" $y7 makeText $w t_g8 "acht Glasen" $y8 #makeText $w t_G "Glasen" $y8 makeText $w t_+1 "und" $z3 makeText $w t_gv "fünf" $z4 makeText $w t_gx "zehn" $z5 makeText $w t_+2 "und" $z6 makeText $w t_gz "zwanzig" $z7 makeText $w t_gM "Minuten" $z8 ## see also: proc upd array set ::sTab { w1 { t_w1 t_dw } w2 { t_w2 t_dw } w3 { t_w3 t_dw } w4 { t_w4 t_dw } w5 { t_w1 t_nw } w0 { t_w2 t_nw } 0 {} 5 { t_+1 t_gv t_gM } 10 { t_+1 t_gx t_gM } 15 { t_+1 t_gv t_gx t_gM } 20 { t_+1 t_gz t_gM } 25 { t_+1 t_gv t_+2 t_gz t_gM } } .c configure -background MediumBlue ;# blue4 } ### proc start_SB1 {w} { puts "SB1: setup for international fuzzy ship's bell" # 8x3 panels: "Forenoon watch three bells and twenty five minutes" destroy $w; pack [canvas $w -width 260 -height 260 -background gray90] set ::scX 12 if { $::pos < 0 } { wm geom . +50+320 } makeText $w t_gI "It is" $::a1 makeText $w t_Su "Sunday" $::b1 makeText $w t_w5 "First" $::c1 ;# 20:00 makeText $w t_w0 "Middle" $::a2 ;# 00:00 makeText $w t_w1 "Morning" $::b2 ;# 04:00 makeText $w t_w2 "Forenoon" $::c2 ;# 08:00 makeText $w t_w3 "Afternoon" $::a3 ;# 12:00 makeText $w t_w4 "Dog" $::b3 ;# 16:00 makeText $w t_gW "watch" $::c3 makeText $w t_g1 "one bell" $::a4 makeText $w t_g2 "two bells" $::b4 makeText $w t_g3 "three bells" $::c4 makeText $w t_g4 "four bells" $::a5 makeText $w t_g5 "five bells" $::b5 makeText $w t_g6 "six bells" $::c5 makeText $w t_g7 "seven bells" $::a6 makeText $w t_g8 "eight bells" $::b6 #makeText $w t_G "bells" $::c6 makeText $w t_HN "Noon" $::c6 makeText $w t_+1 "and" $::a7 makeText $w t_gx "ten" $::b7 makeText $w t_gF "fifteen" $::c7 makeText $w t_gz "twenty" $::a8 makeText $w t_gv "five" $::b8 makeText $w t_gM "minutes" $::c8 array set ::sTab { w0 { t_w0 t_gW } w1 { t_w1 t_gW } w2 { t_w2 t_gW } w3 { t_w3 t_gW } w4 { t_w4 t_gW } w5 { t_w5 t_gW } 0 {} 5 { t_+1 t_gv t_gM } 10 { t_+1 t_gx t_gM } 15 { t_+1 t_gF t_gM } 20 { t_+1 t_gz t_gM } 25 { t_+1 t_gv t_gz t_gM } } .c configure -background MidnightBlue ;# Navy NavyBlue } proc start_SB2 {w} { puts "SB2: setup for international fuzzy ship's bell" # 3x8 panels: "Forenoon watch three bells and twenty five minutes" destroy $w; pack [canvas $w -width 515 -height 110 -background gray90] set ::scX 8 if { $::pos < 0 } { wm geom . +340+320 } makeText $w t_gI "It is" $::x1 makeText $w t_w5 "First" $::x2 ;# 20:00 makeText $w t_w0 "Middle" $::x3 ;# 00:00 makeText $w t_w1 "Morning" $::x4 ;# 04:00 makeText $w t_w2 "Forenoon" $::x5 ;# 08:00 makeText $w t_w3 "Afternoon" $::x6 ;# 12:00 makeText $w t_w4 "Dog" $::x7 ;# 16:00 makeText $w t_gW "watch" $::x8 makeText $w t_g1 "one bell" $::y1 makeText $w t_g2 "two bells" $::y2 makeText $w t_g3 "three bells" $::y3 makeText $w t_g4 "four bells" $::y4 makeText $w t_g5 "five bells" $::y5 makeText $w t_g6 "six bells" $::y6 makeText $w t_g7 "seven bells" $::y7 makeText $w t_g8 "eight bells" $::y8 #makeText $w t_G "bells" $::y8 makeText $w t_Su "Sunday" $::z1 makeText $w t_HN "Noon" $::z2 makeText $w t_+1 "and" $::z3 makeText $w t_gx "ten" $::z4 makeText $w t_gF "fifteen" $::z5 makeText $w t_gz "twenty" $::z6 makeText $w t_gv "five" $::z7 makeText $w t_gM "minutes" $::z8 array set ::sTab { w0 { t_w0 t_gW } w1 { t_w1 t_gW } w2 { t_w2 t_gW } w3 { t_w3 t_gW } w4 { t_w4 t_gW } w5 { t_w5 t_gW } 0 {} 5 { t_+1 t_gv t_gM } 10 { t_+1 t_gx t_gM } 15 { t_+1 t_gF t_gM } 20 { t_+1 t_gz t_gM } 25 { t_+1 t_gv t_gz t_gM } } .c configure -background NavyBlue ;# MidnightBlue MediumBlue } ### Main: wm title . "$Prog(Title) $Prog(Version)" puts "$Prog(Title) $Prog(Version)" bind . <F2> { console show } #catch {console show} ;## #catch {console hide} ;## # Defaults: set fc "DE5" ;# Layout: G:Glasen"=german shipclock / SB:ship's bell international set pos -1 ;# screen: -1:distribute the layouts on screen set sound 0 ;# sound: 0:none 1:once on full hour 2: ship's bell set time t0 ;# time 0: current 1,2: test set lang "xx" ;# language: DE=germany EN=english/international set cons 0 ;# console: debug set menu 0 ;# menu: 0:off 1:on if { $argc > 0 } { set i 0 foreach arg $::argv { incr i puts "argument $i is $arg" ;## set hyp [string first "-" $arg] if { $hyp >= 0 } { if { $arg == "-p0" } { ;# don't set screen-position set pos 0 } elseif { $arg == "-p1" } { ;# top left set pos 1 } elseif { $arg == "-p2" } { ;# top right set pos 2 } elseif { $arg == "-s0" } { ;# no sound set sound 0 } elseif { $arg == "-s1" } { ;# once set sound 1 } elseif { $arg == "-s2" } { ;# ship's bell / Glasen set sound 2 } elseif { $arg == "-t0" } { ;# time - use current time set time t0 } elseif { $arg == "-t1" } { ;# use time from proc t1 set time t1 } elseif { $arg == "-t2" } { ;# set time t2 } elseif { $arg == "-m0" } { ;# no menu set menu 0 } elseif { $arg == "-m1" } { ;# set menu 1 } elseif { $arg == "-cS" } { catch {console show} ;## } elseif { $arg == "-cH" } { catch {console hide} ;## } } else { set fc $arg } } } puts "Args: fc,pos,sound,time: $fc $pos $sound $time" ;## if { $::menu == 1 } { initMenu } initKeys # Todo: use "start DE1", etc. if { $fc == "1" || $fc == "DE1" || $fc == "DE" } { start_DE1 .c ;#DE1 : german fuzzyclock: 8x3 "fünf Minuten vor halb vier Uhr" } elseif { $fc == "2" || $fc == "DE2"} { start_DE2 .c ;#DE2 : german fuzzyclock: "drei Uhr fünf und zwanzig Minuten" } elseif { $fc == "3" || $fc == "DE3"} { start_DE3 .c ;#DE3 : german fuzzyclock: "viertel nach drei" } elseif { $fc == "4" || $fc == "DE4"} { start_DE4 .c ;#DE4 : german fuzzyclock: "viertel nach drei Uhr" } elseif { $fc == "5" || $fc == "DE5"} { start_DE5 .c ;#DE5 : german fuzzyclock: 5x5 ... } elseif { $fc == "6" || $fc == "DE6"} { start_DE6 .c ;#DE6 : german fuzzyclock: 6x4: "drei Uhr fünf und zwanzig Minuten" } elseif { $fc == "7" || $fc == "DE7"} { start_DE7 .c ;#DE7 : german fuzzyclock: 4x6: "drei Uhr fünf und zwanzig Minuten" } elseif { $fc == "11" || $fc == "I1" || $fc == "i1"} { start_I1 .c ;#11: international fuzzyclock: "three o'clock twenty five minutes" } elseif { $fc == "12" || $fc == "I2" || $fc == "i2"} { start_I2 .c ;#12: international fuzzyclock: "quarter past three o'clock" } elseif { $fc == "51" || $fc == "SB1" || $fc == "SB"} { set fc "SB1" start_SB1 .c ;#S1 : international ship's bell: "Forenoon watch three bells and twenty five minutes" } elseif { $fc == "52" || $fc == "SB2"} { start_SB2 .c ;#S2 : int.nat. ship's bell/wide: "Forenoon watch three bells and twenty five minutes" } elseif { $fc == "61" || $fc == "G1" || $fc == "G"} { set fc "G1" start_SG1 .c ;#G1 : german shipclock1: 09:55 --> "zweite Tagwache drei Glasen und fünf und zwanzig Minuten" } elseif { $fc == "62" || $fc == "G2"} { start_SG2 .c ;#G2 : german shipclock2: 09:55 --> "zweite Tagwache drei Glasen und fünf und zwanzig Minuten" } else { puts "Selection invalid: '$fc', using default layout." set fc "I2" start_I2 .c ;#12: international fuzzyclock: "quarter past three o'clock" } if { $::pos == 1 } { p1 } if { $::pos == 2 } { p2 } focus -f .c update help $time after 250 u run2 ### EOF ###
Output edit
International FuzzyClock #2 | German FuzzyClock #2 | Ship's bell |
Ship's bell - wide layout
Remarks edit
if 0 {A
MiHa 2015-02-24 - Some bugfixes for the minute-table, and improved wiki-formatting.MiHa 2015-03-03 - I added two more versions for a german fuzzyclock "morgens viertel nach elf Uhr", meaning "quarter past eleven".Rearranging the panels is much more easy to do now with the spreadsheet-addressing, then with the old list of coordinates.
To avoid adding another row of panels, the entries for "PM"/"evening" and "minutes" had to be dropped.Some ideas for further programming:
- change font of text in lit panels to be bold
- ESC --> Quit
- click on panel "it is" --> update clock
- click on panels "one", "two" etc. --> change layout
- click on panels "before"/"after" --> change color
- catch resize-event, and resize panels and text
- Color-Table (needs some concept)
- F1 --> Help / Balloon-help when hovering over panels
- Tcl by itself is quite simple.
- A demo/HelloWorld-program that shows every feature should be possible in about one printed page
- Things to be aware of:
- comments are commands, so quotes and braces inside need to be balanced
- when to use / not use $ with variablenames ( set i 1; puts $i; incr i $i )
- Tk is much bigger, and needs going to the docs quite often
- The help-docs are not bad as such, but are very frustrating to use -->
- here is still much room for improvement
- IDE: Geany - code completion for tcl needs work
B
MiHa 2015-03-04 - Now finally with an international fuzzyclock "quarter before/past".MiHa 2015-03-05 - I changed the coordinates and scale, to get finer grained text-positioning,as well as adjustable columnwidth for each of the layouts.
Further, I gave each layout its very own position on the screen.When starting, the program now looks at argv, and processes the commandline-arguments.
That works both with tclsh and wish.Currently implemented commandline-arguments to control layout, sound, placement on the screen, menu, and time:
- -s0 -s1 -s2 : no sound / simple chime (beep) at the full hour / ship's bell every half hour.
The default is no sound. - -p0 -p1 -p2 : no setting of screen-position / top left / top right.
The default is to give each layout a unique position on screen. - -t0 -t1 -t2 : current time / time as set by proc t1, t2 etc.
The default is the current time. - -m0 -m1 : no menu / show the menu.
The default is no menu, unless the program is started without any arguments (i.e. "interactive", via doubleclick). - Everything else is understood as a key to select the layout.
If not recognized, some default-layout is used.
I1,I2 for the international clocks, and G1,G2, SB1,SB2 for the ship's bells.With all that plumbing in place, it is now easy to show all the layouts at once, and compare them.
(Re-using my test-setup as a showcase:)To see this in action, use batchfiles (for Windows) such as the following
to start one tcl-interpreter for each of the layouts:
start wish FuzzyClock.tcl DE1 start wish FuzzyClock.tcl DE2 start wish FuzzyClock.tcl DE3 start wish FuzzyClock.tcl DE4 start wish FuzzyClock.tcl DE5 start wish FuzzyClock.tcl DE6 start wish FuzzyClock.tcl DE7 start wish FuzzyClock.tcl DE8 start wish FuzzyClock.tcl I1 start wish FuzzyClock.tcl I2 start wish FuzzyClock.tcl I3and
start wish FuzzyClock.tcl G1 start wish FuzzyClock.tcl G2 start wish FuzzyClock.tcl SB start wish FuzzyClock.tcl SB2 -s2That means, all these clocks are running with no sound, except for the one with -s2,
and all the layouts get distributed to different places across the screen.
C
MiHa 2015-03-13 - I have created layouts for ship's bell / "Glasenuhr"http://en.wikipedia.org/wiki/Ship%27s_bell / http://de.wikipedia.org/wiki/Glasenuhr
with both a german and an international version.My international ship's bell uses the "simpler system" according to the wikipedia-page,
that is, without the dogwatch split into two parts.
Not being a sailor, that looks like the Standard merchant watch system to me.To summarise the concept for the ship's clock:
- In the days of sailing ships, they used hour-glasses for timing,
one glass running 4 hours and another glass running for 30 minutes. - The turning of the glasses are signalled with the ship's bell.
- The day is divided into "watches" (working shifts) that last 4 hours.
The current watch is not announced with the bell - everyone on board has to know that it is day/night/afternoon etc. - Each watch is divided into half-hour periods, so each watch lasts "8 bells",
i.e. it starts with "8 bells" ending the previous watch, gets to "1 bell" after half an hour,
"2 bells" after one hour, etc., and ends with "8 bells" after 4 hours.
But they wait for the exact time, and don't round up.
That means, at 19:23 the fuzzy clocks would say "twenty five minutes",
but the shipclocks would then still say "twenty minutes", and wait until reaching 19:25 to show "twenty five minutes".Finally, I changed the "every" and "sync"-mechanism to use a more gentle approach
to bring the screen-updates to occur on multiples of 10 seconds.
The old coding made the program unresponsive during the first few seconds.MiHa 2015-03-22 - New: "wide layouts" 3x8, used with the new ship's bells "G2" and "SB2".If you find a bug, or have an idea for some original layout, let me know !
Otherwise, have fun !
D
MiHa 2015-04-16 - Now also with layouts of size 4x6, 6x4 and 5x5,and options -t0 -t1 etc. to set a fixed time, eg. for testing, comparisons and screenshots.
On the downside, all those layouts cannot be shown on one screen (of size 1024x768), so the ships bells have been split off.
During the hour after midnight, the german clocks now show "zero o'clock". }MiHa 2015-06-06 - Now featuring a real menu, so you can switch between layouts while the program is running.
Finding the nice, simple and very useful menu-creator m+ by RS was a happy by-product of my work on that GUI-demo Invoice-Demo.MiHa 2015-06-16 - New: a proper helptext (copied from Spider Solitaire, proc showRules).MiHa 2015-06-19 - New: the menu can now be switched off (to save screenspace), and on again with hotkey F3.Next up: layouts with a 24h-clock.