Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q] tclでtkについて質問です (canvas size, put pixel on canvas,draw line)

70 views
Skip to first unread message

Takahide Nojima

unread,
Apr 21, 2002, 9:10:09 PM4/21/02
to
nojimaです。

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

Keiichi Takahashi

unread,
Apr 21, 2002, 11:00:03 PM4/21/02
to
ビットウォークの高橋です。

> [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/

Hoshi Takanori

unread,
Apr 21, 2002, 11:26:52 PM4/21/02
to
ほしです。

# 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 環境なので、線は線として保持
していて、再描画のたびにそれらを書き直すんだったと思うので、線が
大量にあると重くなるような気がします。(最近のマシンなら問題ない、
のかな...)

ほし

Takahide Nojima

unread,
Apr 22, 2002, 12:42:25 AM4/22/02
to
nojimaです。

#follow有難うございました。

Keiichi Takahashi <bit...@jcom.home.ne.jp> writes:

> スクリプトの例をしてはビットウォークのページ、
>
> http://members10.tsukaeru.net/bitwalk/tcltk_fortran_note011.html
>
> を参照してみて下さい。
>
> お役に立つかどうかはわかりませんが、ご参考まで。

極めて参考になりました。こういう手が使えるとは驚きでした

--
Takahide Nojima

Takahide Nojima

unread,
Apr 22, 2002, 12:41:06 AM4/22/02
to
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

Hoshi Takanori

unread,
Apr 22, 2002, 3:07:12 AM4/22/02
to
ほしです。

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 のコード書くのって苦痛だ...

ほし

Tom Sato

unread,
Apr 22, 2002, 3:32:09 AM4/22/02
to
Takahide Nojima <noj...@taito.co.jp> writes:

> > > 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
------------------------------------------------------------

Takahide Nojima

unread,
Apr 22, 2002, 3:53:45 AM4/22/02
to
nojimaです。

#フォロー有難うございます。

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

Takahide Nojima

unread,
Apr 22, 2002, 11:14:52 PM4/22/02
to
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

OSHIRO Naoki

unread,
Apr 25, 2002, 5:09:05 PM4/25/02
to
大城です.

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/

0 new messages