FrontPage

Canvas上の座標を取得する

マウスの移動イベント<Motion>を取得してリアルタイムに表示させる。
サンプルコード上のコメントをもって解説に替える。

制約事項

まだよく分かんない。
とりあえずOSはWindows、Active_Tcl 8.5.5.0でぼちぼちとやってます。


ファイル名:Region_Sense.tcl

# HEAD *********************************************************# プログラムに必要な諸々                           #
package require Tk                                             ;# パッケージの読込み                               #
#/HEAD *********************************************************# プログラムに必要な諸々                           #
# Piano Roll ***************************************************# ピアノロールの描画                               #
proc pianoRoll { x y } {                                       ;# こんな風に書くの超気持ち悪い。なんとかしたい。   #
.c create rectangle 0 10 20 82 -fill gray -width 0             ;# 左端のグレーゾーン                               #
.c create rectangle 501 11 520 81 -fill gray -width 0          ;# 右端のグレーゾーン                               #
                                                               ;#                                                  #
.c create line 20 10 20 82 -fill black -width 1                ;# 輪郭的なもの                                     #
.c create line 49 10 49 82 -fill black -width 1                ;#                                                  #
.c create line 0 10 520 10 -fill black -width 1                ;#                                                  #
.c create line 0 81 520 81 -fill black -width 1                ;#                                                  #
.c create line 500 10 500 81 -fill black -width 1              ;#                                                  #
                                                               ;#                                                  #
.c create line $x $y [expr { $x + 29 }] $y -fill black -width 1 ;#                                                 #
.c create line [expr { $x + 30 }] $y 500 $y -fill #666666 -width 1 ;# 延長線                                       #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 8 }] \
               [expr { $x + 29 }] [expr { $y + 8 }] -fill black -width 1 ;#                                        #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 18 }] \
               [expr { $x + 29 }] [expr { $y + 18 }] -fill black -width 1 ;#                                       #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 28 }] \
               [expr { $x + 29 }] [expr { $y + 28 }] -fill black -width 1 ;#                                       #
                                                               ;#                                                  #
.c create line $x [expr { $y + 35 }] \
               [expr { $x + 29 }] [expr { $y + 35 }] -fill black -width 1 ;#                                       #
.c create line [expr { $x + 30 }] [expr { $y + 35 }] \
               500 [expr { $y + 35 }] -fill #666666 -width 1   ;#                                                  #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 43 }] \
               [expr { $x + 29 }] [expr { $y + 43 }] -fill black -width 1 ;#                                       #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 53 }] \
               [expr { $x + 29 }] [expr { $y + 53 }] -fill black -width 1 ;#                                       #
                                                               ;#                                                  #
.c create line $x [expr { $y + 60 }] \
               [expr { $x + 29 }] [expr { $y + 60 }] -fill black -width 1 ;#                                       #
.c create line [expr { $x + 30 }] [expr { $y + 60 }] \
               500 [expr { $y + 60 }] -fill #666666 -width 1   ;#                                                  #
                                                               ;#                                                  #
.c create line [expr { $x + 17 }] [expr { $y + 68 }] \
               [expr { $x + 29 }] [expr { $y + 68 }] -fill black -width 1 ;#                                       #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 6 }] \
                    [expr { $x + 17 }] [expr { $y + 10 }] -fill black ;#                                           #
.c create rectangle [expr { $x + 30 }] [expr { $y + 6 }] \
                    500 [expr { $y + 10 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 16 }] \
                    [expr { $x + 17 }] [expr { $y + 20 }] -fill black ;#                                           #
.c create rectangle [expr { $x + 30 }] [expr { $y + 16 }] \
                    500 [expr { $y + 20 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 26 }] \
                    [expr { $x + 17 }] [expr { $y + 30 }] -fill black ;#                                           #
.c create rectangle [expr { $x + 30 }] [expr { $y + 26 }] \
                    500 [expr { $y + 30 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 41 }] \
                    [expr { $x + 17 }] [expr { $y + 45 }] -fill black ;#                                           #
.c create rectangle [expr { $x + 30 }] [expr { $y + 41 }] \
                    500 [expr { $y + 45 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 51 }] \
                    [expr { $x + 17 }] [expr { $y + 55 }] -fill black ;#                                           #
.c create rectangle [expr { $x + 30 }] [expr { $y + 51 }] \
                    500 [expr { $y + 55 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
.c create rectangle $x [expr { $y + 66 }] [expr { $x + 17 }] \
                    [expr { $y + 68 }] -fill black             ;#                                                  #
.c create rectangle [expr { $x + 30 }] [expr { $y + 66 }] \
                    500 [expr { $y + 68 }] -fill #AAAAAA -width 0 ;#                                               #
                                                               ;#                                                  #
for {set cnt 1} {$cnt < 8} {incr cnt} {                        ;# 小節線の描画                                     #
    set x [expr {$cnt * 60}]                                   ;#                                                  #
    .c create line $x 8 $x 81 -width 1                         ;#                                                  #
    .c create line [expr { $x + 15}] 8 [expr { $x + 15}] 81 -fill #AAAAAA -width 1 ;#                              #
    .c create line [expr { $x + 30}] 8 [expr { $x + 30}] 81 -fill #AAAAAA -width 1 ;#                              #
    .c create line [expr { $x + 45}] 8 [expr { $x + 45}] 81 -fill #AAAAAA -width 1 ;#                              #
}                                                              ;#                                                  #
    .c create line 480 8 480 81 -width 1                       ;# 小節線の描画(残り)                               #
    .c create line 495 8 495 81 -fill #AAAAAA -width 1         ;#                                                  #
}                                                              ;#                                                  #
#/Piano Roll ***************************************************#                                                  #
# Region Sense *************************************************# 感知のカード                                     #
wm title . "Region Sense"                                      ;# メインウィンドウのタイトル                       #
wm geometry . 520x160+250+200                                  ;# メインウィンドウの大きさと表れる座標             #
set font {Times 10}                                            ;# フォントの指定                                   #
                                                               ;#                                                  #
button .exit -width 4 -text "Exit" -command exit               ;# 終了ボタンの生成                                 #
place .exit -x 1 -y 1 -anchor nw                               ;# プレイサーによる位置決め                         #
                                                               ;#                                                  #
frame .bBarL -borderwidth 1 -relief groove                     ;# フレーム左(試作)                                 #
place .bBarL -x 41 -y 1 -anchor nw                             ;# プレイサーによる位置決め                         #
label .bBarL.msg -font $font -wraplength 200  -justify right -text "This is only a test." ;# The future.           #
pack .bBarL.msg -side right                                    ;# パッカーによる位置決め                           #
                                                               ;#                                                  #
frame .bBarR -borderwidth 1 -relief groove                     ;# フレーム右(試作)                                 #
place .bBarR -x 519 -y 1 -anchor ne                            ;# プレイサーによる位置決め                         #
label .bBarR.msg -font $font -wraplength 200  -justify right -text "This is only a test." ;# The future.           #
pack .bBarR.msg -side right                                    ;# パッカーによる位置決め                           #
                                                               ;#                                                  #
frame .sBar -borderwidth 1 -relief sunken                      ;# いわゆるステータスバー                           #
pack .sBar -side bottom -fill x                                ;# パッカーによる位置決め                           #
                                                               ;#                                                  #
label .sBar.coordinate -font $font -wraplength 5i -justify right -text "This is only a test." ;# The future.       #
pack .sBar.coordinate -side right                              ;# パッカーによる位置決め                           #
                                                               ;#                                                  #
canvas .c -background white -width 510 -height 100             ;# キャンバスの定義                                 #
#pack .c -side bottom -fill x                                   ;# パッカーによる位置決め                           #
place .c -x 0 -y 25 -anchor nw                                 ;# プレイサーによる位置決め *他もプレイサーなので*  #
                                                               ;#                                                  #
pianoRoll 20 13                                                ;# 描画開始位置を渡してピアノロールの描画を依頼     #
                                                               ;#                                                  #
bind .c <Motion> { motionSense %x %y }                         ;# モーションイベントを感知して表示させる           #
                                                               ;#                                                  #
                                                               ;#                                                  #
#/Region Sense *************************************************#                                                  #
# Motion Sense *************************************************# モーション感知                                   #
proc motionSense { x y } {                                     ;#                                                  #
#    set size [winfo fpixels .c 1i]                            ;# そんなに細かい値はいらんです                     #
#    set x [expr $x/$size]                                     ;#                                                  #
#    set y [expr $y/$size]                                     ;#                                                  #
    .sBar.coordinate configure \
        -text [format "x: %6i y: %6i" $x $y ]                  ;# 座標のリアルタイム表示                           #
#        -text [format "x: %6.2fi y: %6.2fi" $x $y ]            ;# そんなに細かい値はいらんです                     #
}                                                              ;#                                                  #
#/Motion Sense *************************************************#                                                  #

修正履歴


課題

管理人自身、この言語がいまいち理解できていない。

  1. マニュアルが英語版しかなくて辛い。 → 頑張って読め。
  2. コマンドにオプションが多く、把握しきれていない。 → よく使うところから覚えろ。
  3. おいおいマジかよ。 → クロスプラットフォームなGUIを目指そう。

    はぁ・・・・。
  • 備考

参考ページ

[Active_State: http://www.activestate.com/Products/activetcl/feature_list.mhtml]


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-08 (月) 02:08:18 (5191d)