#
# tokei.tcl : アナログ時計
#
# Tcl/Tk 講座、ウィンドウサイズ変更のサンプル
#
# Copyright (C) 2001 by M.Hiroi
#
# 背景の描画
proc draw_backboard {} {
global backboard sin_table cos_table width
set r [expr $width / 2]
# 円
.c0 coords $backboard(circle) 5 5 [expr $width - 5] [expr $width - 5]
# 目盛
for {set i 0} {$i < 12} {incr i} {
set s1 [format "%02d" [expr $i * 5]]
set x1 [expr $r + ($r - 5) * $sin_table($s1)]
set y1 [expr $r - ($r - 5) * $cos_table($s1)]
set x2 [expr $r + ($r - 5) * 4 / 5 * $sin_table($s1)]
set y2 [expr $r - ($r - 5) * 4 / 5 * $cos_table($s1)]
.c0 coords $backboard($i) $x1 $y1 $x2 $y2
}
}
# 針を描く
proc draw_hand {} {
global sec min hour sin_table cos_table width
set now_time [clock seconds]
set s [clock format $now_time -format "%S"]
set m [clock format $now_time -format "%M"]
set h [clock format $now_time -format "%I"]
set r [expr $width / 2]
set rs [expr $r * 7 / 8]
set rm [expr $r * 6 / 8]
set rh [expr $r * 5 / 8]
# 秒
set x1 [expr $r + $rs * $sin_table($s)]
set y1 [expr $r - $rs * $cos_table($s)]
.c0 coords $sec $r $r $x1 $y1
# 分
set x1 [expr $r + $rm * $sin_table($m)]
set y1 [expr $r - $rm * $cos_table($m)]
.c0 coords $min $r $r $x1 $y1
# 時
set x1 [expr $r + $rh * $sin_table($h,$m)]
set y1 [expr $r - $rh * $cos_table($h,$m)]
.c0 coords $hour $r $r $x1 $y1
}
# 大きさの変更
proc change_size {} {
global width
# .c0 cget -width は最初に設定したオプション値を取得するだけ
set w [winfo width .c0]
set h [winfo height .c0]
if {$w < $h} {
set width $w
} else {
set width $h
}
draw_backboard
draw_hand
}
# 表示
proc show_time {} {
draw_hand
after 1000 show_time
}
# 画面の設定
wm minsize . 100 100
wm maxsize . 400 400
canvas .c0 -width 140 -height 140 -bg darkgreen
pack .c0 -expand 1 -fill both
# バインディング
bind .c0 <Configure> "change_size"
# 初期化
set width 140
# sin, cos テーブルの作成
for {set i 0} {$i < 60} {incr i} {
set rad [expr 3.14 / 30 * $i]
set s1 [format "%02d" $i]
set sin_table($s1) [expr sin($rad)]
set cos_table($s1) [expr cos($rad)]
for {set j 0} {$j < 12} {incr j} {
set rad [expr 3.14 / 360 * ($j * 60 + $i)]
set s2 [format "%02d" $j]
set sin_table($s2,$s1) [expr sin( $rad )]
set cos_table($s2,$s1) [expr cos( $rad )]
}
}
# 図形の生成
set backboard(circle) [.c0 create oval 5 5 135 135 -fill darkgray -outline darkgray]
for {set i 0} {$i < 12} {incr i} {
set backboard($i) [.c0 create line $i $i 135 135 -width 2.0]
}
set hour [.c0 create line 70 70 70 30 -fill blue -width 3.0]
set min [.c0 create line 70 70 70 20 -fill green -width 2.0]
set sec [.c0 create line 70 70 70 15 -fill red]
# 背景の描画
#draw_backboard
# 最初の起動
show_time
戻る