# clock.tcl proc every {ms body} { eval $body after $ms [list every $ms $body] } pack [label .l -textvar time -font {Tahoma 24}] pack [button .b -text X -command exit] every 1000 {set ::time [clock format [clock sec] -format %H:%M:%S]} ---- [LV] It probably would be best for whomever added the above to add a name and a [EULA] type statement indicating the code is allowed to be reused. - [RS]: I put it here in order to test whether pages with .tcl titles are still delivered as plain text (they aren't), and trying to have my XDA execute it somehow - but it didn't work :( And re licensing: doesn't [Who owns the content of this Wiki] tell it clearly enough? Well, it certainly sets a general expectation. However, applications having the licensing spelled out explicitly ensures there is no confusion when the application is reaped from the wiki into a distribution. ---- [EKB] Here's a version that has a task timer as well as a clock. It lacks the elegant simplicity of the code above, but it adds some functionality that I was looking for. wm attributes . -topmost 1 image create photo actcross16 -data { R0lGODlhEAAQAIIAAASC/PwCBMQCBEQCBIQCBAAAAAAAAAAAACH5BAEAAAAA LAAAAAAQABAAAAMuCLrc/hCGFyYLQjQsquLDQ2ScEEJjZkYfyQKlJa2j7AQn MM7NfucLze1FLD78CQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJz aW9uIDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVz ZXJ2ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7 } image create photo appclock16 -data { R0lGODlhEAAQAIUAAPwCBHy+/HS6/Gy2/ITC/Pz+/Fyu/FSm/Pz6/ESW7Pzm hPzqnPzurOz2/OTu/PzmjPzqpAR2/PzyxPz2xPz2zEye9NTm/ARy/Pz21Mzi /Lza/DyK3PzutPzyvPzyzPz63Pz67DyO5KzS/Pz23KTO/DSC1DSC3JzK/CR6 zPz+9Iy+/FSq/IS6/BxyxPT2/Hy2/HSy/MTe/Gyu/CRyxJTG/IS+/DSG1AAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAaz QIBQGAgIBIPBcAkgBArQqOHAJESRA0MBgUgMrYWjYrFgHA4NhxfwFCgeC0hE MqFULN5nGF6+SDAYCRkaG21wEBwdER4fICAhIhsCBQNkDBwRFxgjjhskJZMD iBeZF44gBSYnKAMFBpd/m44pKSUqrFArE4yNqKkqLC0ABi4HHhinBSkFLS/C ACtpFQmOUCYlLDDPABUOGTEhJeIvLzIzTAkJIiInNDXO20wbNiYoKOdLfkEA If5oQ3JlYXRlZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2 ZWxDb3IgMTk5NywxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KaHR0cDov L3d3dy5kZXZlbGNvci5jb20AOw== } proc every {ms body} { eval $body after $ms [list every $ms $body] } proc timeElapsed {sec} { set hours [expr {$sec / 3600}] set mins [expr {($sec / 60) % 60}] return [format "%02d:%02d" $hours $mins] } set timerstate 0 proc toggleTimer {b} { if {$::timerstate} { $b config -relief flat set ::timerstate 0 } else { $b config -relief sunken set ::t0 [clock sec] set ::timerstate 1 } } ## -- Top frame pack [frame .top] -side top pack [label .top.l -textvar time -font {Tahoma 18}] -side left # Buttons pack [frame .top.buttons] -side right set clockbutton [button .top.buttons.t -image appclock16 -relief flat] pack $clockbutton -side left pack [button .top.buttons.close -image actcross16 -command {exit} -relief flat] \ -side left ## -- Bottom frame pack [frame .bottom] -side bottom pack [label .bottom.l -textvar telapsed -font {Tahoma 10}] $clockbutton config -command "toggleTimer $clockbutton" ## -- Start! every 1000 { set ::time [clock format [clock sec] -format %H:%M] if {$::timerstate} {set ::telapsed [timeElapsed [expr {[clock sec] - $::t0}]]} } ---- [Category Application] | [Category GUI] | [Category Date and Time]