tcl8.0の元でtk8.0を使い、X上で利用する場合を想定します。
[Q1]
canvas .field
pack .field
した時のcanvasの大きさを知る方法はありますでしょうか?
(man n canvasはしたのですが、どうしてもわからなかったです)
[Q2] canvas上に点(1x1のピクセル)を打つ為の良い方法はありますでしょうか?
自分で思い付くのは、
・1x1のrectangle itemか、
・1x1のline itemか、
・1x1のarc itemか、
ですが、もっと良い方法がありますでしょうか?
[Q3] 計算によって求まる大量の頂点をlineで結びたいと思います。
参考になるソースはありますでしょうか?
自分では、
set vertex ""
for {...省略...}{
set calculated_x [...何らかの計算...]
set calculated_y [...何かの計算...]
set vertex "$vertex $calculated_x $calculated_y"
}
eval "path create line $vertex -fill black"
ぐらいしか思い付かないのです。しかし、もうちょっと、スマートな方
法があるような気がしないでもないです。もし何か良い方法をご存じの
方はよろしくおねがいします。
--
Takahide Nojima
> [Q3] 計算によって求まる大量の頂点をlineで結びたいと思います。
> 参考になるソースはありますでしょうか?
どのぐらい大量の頂点かどうかにも依りますが、キャンバス上にcreate lineの
ようなコマンドで描画すると、全ての線に対してIDが割り付けられ、時としてメ
モリを大量に消費します。
もし、描画した図形に対してタグバインドをかけないのであれば、キャンバス上
に画像として描画する方が効率的な場合もあります。
スクリプトの例をしてはビットウォークのページ、
http://members10.tsukaeru.net/bitwalk/tcltk_fortran_note011.html
を参照してみて下さい。
お役に立つかどうかはわかりませんが、ご参考まで。
--
Keiichi Takahashi, bitWalk Co.,Ltd.
mailto:bit...@jcom.home.ne.jp
http://members10.tsukaeru.net/bitwalk/
# tcl/tk のことなんてあんまり憶えてませんが、、、
In article <tzz4ri4...@nightmare.hm.taito.co.jp>
Takahide Nojima <noj...@taito.co.jp> writes:
> [Q1]
> canvas .field
> pack .field
>
> した時のcanvasの大きさを知る方法はありますでしょうか?
.field configure -width
.field configure -height
とか。ちなみに、大きさを指定するには、canvas 生成時に
canvas .field -width 200 -height 300
としたり、canvas 生成後に
.field configure -width 200 -height 300
とします。
> (man n canvasはしたのですが、どうしてもわからなかったです)
reference manual は reference manual なので、最初は入門書を
お読みになった方が、全体像がつかめてよろしいかと...
> [Q2] canvas上に点(1x1のピクセル)を打つ為の良い方法はありますでしょうか?
点の数にもよりますが、たくさん打ちたいのなら bitmap を利用するのが
いいかも知れません。
> 自分で思い付くのは、
>
> ・1x1のrectangle itemか、
> ・1x1のline itemか、
> ・1x1のarc itemか、
>
> ですが、もっと良い方法がありますでしょうか?
よく憶えてませんが、たしか point というのはなかったような気が
するので、だとしたらそのような方法で代用するしかないでしょう。
というか、canvas は vector graphic 環境なので、たとえば拡大縮小や
PostScript データの生成とかもできたように思いますが、その際に
どういう挙動をしてほしいかによっても変わってきます。
> [Q3] 計算によって求まる大量の頂点をlineで結びたいと思います。
> 参考になるソースはありますでしょうか?
nojima さんのお書きになったような方法でいいというか、canvas って
そんなもの、でしょう。
というか、canvas は vector graphic 環境なので、線は線として保持
していて、再描画のたびにそれらを書き直すんだったと思うので、線が
大量にあると重くなるような気がします。(最近のマシンなら問題ない、
のかな...)
ほし
#follow有難うございました。
Keiichi Takahashi <bit...@jcom.home.ne.jp> writes:
> スクリプトの例をしてはビットウォークのページ、
>
> http://members10.tsukaeru.net/bitwalk/tcltk_fortran_note011.html
>
> を参照してみて下さい。
>
> お役に立つかどうかはわかりませんが、ご参考まで。
極めて参考になりました。こういう手が使えるとは驚きでした
--
Takahide Nojima
#早速の返答ありがとうございます。
ho...@sra.co.jp (Hoshi Takanori) writes:
> > canvas .field
> > pack .field
> >
> > した時のcanvasの大きさを知る方法はありますでしょうか?
>
> .field configure -width
> .field configure -height
>
> とか。
すみません。実はこの方法だと、-expand yesでpackしたとき、Windowサイズ
が変更されても値に反映されないように見えます。以下のソースで試しました。
----------sample.tcl-----------
#!/usr/bin/wish -f
canvas .field
frame .cntrl
button .cntrl.update -text "Update" -command {
puts [ .field configure -width]
puts [ .field configure -height]
}
pack .cntrl.update
pack .field -side left -fill both -expand yes
pack .cntrl -side left
.field create rectangle 1 1 200 200 -width 1
.field create rectangle 1 1 300 300 -width 1
.field create rectangle 1 1 400 400 -width 1
----------sample.tcl-----------
> > [Q2] canvas上に点(1x1のピクセル)を打つ為の良い方法はありますでしょうか?
>
> 点の数にもよりますが、たくさん打ちたいのなら bitmap を利用するのが
> いいかも知れません。
この手は思い付きませんでした。次はこれでやってみます。
> というか、canvas は vector graphic 環境なので、たとえば拡大縮小や
> PostScript データの生成とかもできたように思いますが、その際に
> どういう挙動をしてほしいかによっても変わってきます。
なるほどです。
> > [Q3] 計算によって求まる大量の頂点をlineで結びたいと思います。
> > 参考になるソースはありますでしょうか?
>
> nojima さんのお書きになったような方法でいいというか、canvas って
> そんなもの、でしょう。
>
了解しました。有難うございます。
--
Takahide Nojima
In article <tzzwuv0...@nightmare.hm.taito.co.jp>
Takahide Nojima <noj...@taito.co.jp> writes:
> すみません。実はこの方法だと、-expand yesでpackしたとき、Windowサイズ
> が変更されても値に反映されないように見えます。以下のソースで試しました。
> .field create rectangle 1 1 200 200 -width 1
> .field create rectangle 1 1 300 300 -width 1
> .field create rectangle 1 1 400 400 -width 1
これはあくまで、canvas の中に rectangle を作っただけで、
canvas そのものの大きさが変わるわけではありません。
試しに、
> button .cntrl.update -text "Update" -command {
> puts [ .field configure -width]
> puts [ .field configure -height]
> }
ここを、
button .cntrl.update -text "Update" -command {
.field configure -width [expr [lrange [.field configure -width] 4 4] + 100]
.field configure -height [expr [lrange [.field configure -height] 4 4] + 100]
}
と変えてみたら Update ボタンを押すたびにウィンドウが大きく
なりました。
# やっぱ tcl のコード書くのって苦痛だ...
ほし
> > > canvas .field
> > > pack .field
> > >
> > > した時のcanvasの大きさを知る方法はありますでしょうか?
> >
> > .field configure -width
> > .field configure -height
> >
> > とか。
>
> すみません。実はこの方法だと、-expand yesでpackしたとき、Windowサイズ
> が変更されても値に反映されないように見えます。以下のソースで試しました。
ウィンドウの枠の幅も含められてしまいますが、
winfo width .field
winfo height .field
ではどうでしょう?
canvas .w -width 100 -height 100 -borderwidth 10
pack .w
update
puts "[ winfo width .w ] x [ winfo height .w ]"
としてみると、122 x 122 と言われてしまいますが...
------------------------------------------------------------
Tomonori Sato <VEF0...@nifty.ne.jp>
URL: http://member.nifty.ne.jp/tsato/index-j.html
― xfig / xvkbd / 電気製品の EMC/安全適合性、他
# New ― xvkbd-2.3 (virtual keyboard for X)、「バナナの皮」 Issue 39
------------------------------------------------------------
#フォロー有難うございます。
ho...@sra.co.jp (Hoshi Takanori) writes:
> > すみません。実はこの方法だと、-expand yesでpackしたとき、Windowサイズ
> > が変更されても値に反映されないように見えます。以下のソースで試しました。
>
> > .field create rectangle 1 1 200 200 -width 1
> > .field create rectangle 1 1 300 300 -width 1
> > .field create rectangle 1 1 400 400 -width 1
>
> これはあくまで、canvas の中に rectangle を作っただけで、
> canvas そのものの大きさが変わるわけではありません。
あっ、言葉足らずですみません。
canvasウィジットは何も書いてないと、どこまでcanvasが見えてるかが全く別
らないため、目安でcreate rectangleしました。ここで、
1) 先のプログラム(sample.tcl)を実行した後、
2) ウィンドウサイズをマウスで引っ張って変え、(この時、ウィンドウにク
リップされていたrectangleが見えるようになることを確認)
3) updateボタンを押す
どうも明らかにウィンドウサイズ(canvasもexpandしている)を変更している
のに、.field configure -width,.field configure -heightが変更されませ
ん。
どうすれば今見えているcanvasのサイズを得ることが出来ますでしょうか?
--
Takahide Nojima
フォロー有難うございます。
Tom Sato <VEF0...@nifty.ne.jp> writes:
> ウィンドウの枠の幅も含められてしまいますが、
>
> winfo width .field
> winfo height .field
>
> ではどうでしょう?
>
> canvas .w -width 100 -height 100 -borderwidth 10
> pack .w
> update
> puts "[ winfo width .w ] x [ winfo height .w ]"
>
> としてみると、122 x 122 と言われてしまいますが...
なるほどです。有難うございます。どうにもならない時はこの手を使うことにします。
#理想はcanvasの大きさですが、仕方ないのでしょうか?
--
Takahide Nojima
Tom Sato <VEF0...@nifty.ne.jp> writes:
> ウィンドウの枠の幅も含められてしまいますが、
..
> canvas .w -width 100 -height 100 -borderwidth 10
全体幅には "-highlightthickness" も含まれるようです.さらに,これらの
オプションはキャンバスの表示原点にも反映してました(知らんかった……).
サンプルをつけます.Tcl/Tk-8.0.5 で確認しました.
--ここから---------------------------------------------------------------
#!/usr/local/bin/wish
#
# canvaswidth.tcl: キャンバスの現在幅を表示する
#
# [2002/04/26] OSHIRO Naoki. <osh...@mibai.tec.u-ryukyu.ac.jp>
#
proc putsSize {win w h} {
# 飾り幅
set tw [$win cget -highlightthickness]
set bw [$win cget -borderwidth]
set rw [expr $tw+$bw]
# キャンバス座標と幅
set x0 [expr [winfo rootx $win]+$rw]
set y0 [expr [winfo rooty $win]+$rw]
set cw [expr $w-$rw*2]
set ch [expr $h-$rw*2]
set cw_opt [$win cget -width]
set ch_opt [$win cget -height]
# スクロール領域
set sr [$win cget -scrollregion]
set sw [lindex $sr 2]
set sh [lindex $sr 3]
set sx [expr int($sw*[lindex [$win xview] 0])]
set sy [expr int($sh*[lindex [$win yview] 0])]
# 幅情報の表示更新
.c coord size [expr $cw/2+$sx] [expr $ch/2+$sy]
.c itemconfigure size -text "${cw}x$ch\n(${cw_opt}x$ch_opt)"
foreach {tag x y} "lu $sx $sy rb [expr $cw+$sx] [expr $ch+$sy]" {
.c itemconfigure $tag -text ($x,$y)
.c coord $tag $x $y
}
# バルーンの移動
set lw [winfo width .lu]
set lh [winfo height .lu]
wm geometry .lu [format "+%d+%d" [expr $x0-$lw] [expr $y0-$lh]]
wm geometry .rb [format "+%d+%d" [expr $x0+$cw] [expr $y0+$ch]]
}
proc scrollCanvas {c args} {
eval $c $args
putsSize $c [winfo width $c] [winfo height $c]
}
#
# キャンバスの準備
#
set c_w 1000
set c_h 500
canvas .c -width 400 -height 200 \
-background palegreen \
-highlightcolor DarkOliveGreen -relief raised \
-scrollregion "0 0 $c_w $c_h" \
-xscrollcommand ".cx set" -yscrollcommand ".cy set"
scrollbar .cx -command "scrollCanvas .c xview" -orient horizontal
scrollbar .cy -command "scrollCanvas .c yview"
focus .c
grid .c .cy -sticky news
grid .cx -sticky ew
grid rowconfigure . 0 -weight 1
grid columnconfigure . 0 -weight 1
# 情報表示用アイテム生成
.c create text 0 0 -tag size -justify center
.c create text 0 0 -tag lu -anchor nw -fill brown
.c create text 0 0 -tag rb -anchor se -fill brown
# グリッド生成
for {set x 0} {$x<$c_w} {incr x 50} {.c create line $x 0 $x $c_h -tag grid}
for {set y 0} {$y<$c_h} {incr y 50} {.c create line 0 $y $c_w $y -tag grid}
.c itemconfigure grid -fill honeydew
.c lower grid
#
# バインド設定
#
bind . <Configure> {putsSize .c %w %h}
bind . <FocusIn> {putsSize .c [winfo width .c] [winfo height .c]}
bind . <q> exit
#
# サイズ提示用バルーン
#
foreach {t l} {.lu 左上 .rb 右下} {
toplevel $t; wm overrideredirect $t 1
label $t.l -text $l -relief raised -borderwidth 3
pack $t.l
}
#
# オプション調整スケール
#
set t .t
toplevel $t
wm title $t "Canvas Option"
foreach {w opt} {hw highlightthickness bw borderwidth} {
label $t.l$w -text $opt
scale $t.$w -from 0 -to 100 -command ".c configure -$opt" \
-orient horizontal
pack $t.l$w $t.$w -fill x
}
bind $t <q> exit
--ここまで---------------------------------------------------------------
=============================================
OSHIRO Naoki: osh...@mibai.tec.u-ryukyu.ac.jp
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/