M.Hiroi's Home Page

Tcl/Tk GUI Programming

Tcl/Tk お気楽 GUI プログラミング応用編

アナログ時計:ソースファイル

[ Home | Tcl/Tk GUI Programming ]
#
# 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

戻る


Copyright (C) 2001-2003 Makoto Hiroi
All rights reserved.

[ Home | Tcl/Tk GUI Programming ]