Tcl/Tk めも
最終更新: [2008/06/18]
- Tcl/Tk に関する日本語メーリングリストは存在しないのか?
- Tcl/Tk の set コマンドでは 'foreach {x y} {1 2} {...}' のようにリスト
- Tcl/Tk では日本語フォントを自由にスケーリングすることはできない.フォ
- Tcl/Tk の図形を可換にすることはできないか?
- tcl/tk の switch 文は expect のように項目別に対応の型指定 (-regexp と
- Tcl/Tk のキャンバス上のテキストは最後に改行が入ると find で検索できな
- tcltk で可変引数を取得するには proc の引数記述箇所で args とする.
- Tcl/Tk の canvas からの postscript 出力でファイル内での Title 行を指定
- Tcl/Tk での画像の1ピクセルへの色設定
- Tcl/Tk のリスト操作 C 関数ソースのありか
- tcl/tk で scale ウィジェットなどに -command でコマンドを割り付ける場合
- Tcl/Tk へ C から値を設定する.
- tcl/tk でのセレクション法
- tcl/tk での selection の結果を他のアプリケーションにも渡そうとするなら,
- tcl/tk の selection handle でのハンドラ登録ではハンドラ関数への引数の
- tcl/tk の foreach コマンドでは複数変数への値の代入がすぐにできるので,
- 2次のBスプライン曲線は制御線どうしをつないだ直線が接線となる.3次の
- tcl でリストを逆転することはできないの?
- xv の pics ファイルは P7 というヘッダがついているのだが,これは pnm フォー
- Tcl/Tk で複数のスケールウィジェットをスクロールさせたい,という場合に
- tcl/tk のキャンバスで,最後に空白/改行を含む text がある場合には,find
- tcl/tk キャンバスの line は端点の座標が重なっていれば polygon の扱いを
- tcl/tk キャンバスの 'find enclosed x0 y0 x1 y1' ではテキストアイテムは
- tcl/tk の wm コマンドのソースは tk*/unix/tkUnixWm.c にある.
- 「入門 tcl/tk」久野のまえがきに,「tcl は他の言語の補完として用いるこ
- 宮田・芳賀の「Tcl/Tk プログラミング入門」では tk キャンバスの曲線補間
- Tcl/Tk のウィジェットサンプルは,「お,こんなことができるのか!?」と
- Tcl/Tk のキャンバスで,網目かけをするには各アイテムに対して -stiple オ
- ウェルチの「Tcl/Tk 入門」に,2種類のスライダを持つスケールの例がある.
- tcl/tk のウィンドウアイコンの指定 'wm iconbitmap' は XBM (bitmap) 形式
- tcl/tk のキャンバスウィジェットの postscript コマンドに出力時のスケー
- tcl/tk のキャンバスウィジェットでのフォント表示では,英フォントであれ
- tcl/tk のキャンバスから出力される Postscript ファイルは fixeucfont コ
- tcl/tk の text ウィジェットで現カーソル位置に文字を挿入するには.
- Tcl/Tk でトップレベルウィジェットを pack した順に生成していくには,
- Tcl/Tk のキャンバスウィジェットを PostScript 出力すると微妙に縮小され
- Tcl/Tk の canvas:postscript コマンドって貼り込んだ画像には対応してない
- Tcl/Tk の canvas の image ってちゃんと GIF の透明色指定に対応してる.
- Tcl/Tk のバージョン表示は 8.0.3 であっても 8.0 とかにしかならない(例:
- Tcl/Tk では,文字列のチェックを行うには if だと [string compare $str1
- tcl/tk のキャンバスでドラッグ&ドロップするには.
- tkstep を使えば,tcl/tk でドラッグ&ドロップできる
- tcl/tk でのファイルの双方向入出力は fileevent を使うらしい.
- 「Tcl/Tk プログラミング入門」の図形エディタの例題プログラム zskeletn5
- tcl/tk で画像表示
- C から Tcl/Tk ライブラリを使用するときは,シェアードライブラリをインス
- tcl/tk: listbox は イベントは受け取れんのか? frame あたりで括る
- tcl/tk はフレームへの名前付けに苦労するな.単に個別ウィンドウをまとめ
- tcl/tk で listbox の内容を更新するには?
- tcl/tk と Emacs/Mule とで連携処理はできんのか?
- tcl/tk での割算で小数点以下の値を得るにはどうするの?
- tcl/tk のリストボックスは,表示ラベルの改行は空白へ変換してくれるのだ
- tcl/tk では send で情報のやり取りが可能らしい.これを使えば perl でい
- Tck/Tk はシャープ # でのコメントアウト後でもブレース } があるとこれを
- tcl/tk の Canvas ウィジェットでは,create した順に上書きされる.確かこ
- tcl/tk の radiobutton は設定した変数の値が変わるとアクティブも自動でそ
- tcl/tk での動画グラフィックでは for 文などで連続的に変化させるのではな
- Mule のなにかのバッファでシャープ # でのコメントの行に記述してるときに,
- tcl の if 文って "if {}{}" とブレース同士をくっつけてしまうとエラーが
- -->global と upvar の違いって何?
- tcl の if 文で AND 条件を表すにはどうするの?
- tk でスペースキーをバインドするのはどうやるの?
※自動生成のため項目順序が変わる可能性があります.
Tcl/Tk に関する日本語メーリングリストは存在しないのか?
-->残念ながら現在のところないらしい...
Tcl/Tk の set コマンドでは 'foreach {x y} {1 2} {...}' のようにリスト
型での変数名の指定はできない.これを実現するには次のような proc を使う
といいのかも.
-->proc sets {{vars} {vals}} {
foreach var $vars {
upvar $var x
set x [lindex $vals 0]
set vals [lreplace $vals 0 0]
}
}
Tcl/Tk では日本語フォントを自由にスケーリングすることはできない.フォ
ント要求に応じて X サーバ側で対応する必要がある.もし,要求フォントが
存在しない場合はそれを用意するまでに X サーバの応答がとてつもなく遅く
なる可能性がある.
-->X-tt などを使えば問題ないのかも.
Tcl/Tk の図形を可換にすることはできないか?
-->一度消去して,その座標を使って新たに生成すればいいだけ?
tcl/tk の switch 文は expect のように項目別に対応の型指定 (-regexp と
か) をすることはできんのか?すべてを regexp にしてしまうと "line" に
"pline" もマッチしてしまって混乱する.これを除こうとすると煩雑だ.
-->限定候補である "pline" を先に並べればいいことではあるが...
Tcl/Tk のキャンバス上のテキストは最後に改行が入ると find で検索できな
くなるみたい.
tcltk で可変引数を取得するには proc の引数記述箇所で args とする.
-->可変引数でオプションを処理する例.
file:$TCLLIB/http2.0/http.tcl#http::geturl
Tcl/Tk の canvas からの postscript 出力でファイル内での Title 行を指定
することはできないか?
-->そのままだと canvas のウィンドウ名(.c など)がタイトルになってしま
う.
-->現在は一旦出力したファイルの該当行を perl で書き換えている
perl -i -e 'while (&lt>) {last if s/^(%%Title: )(.+)/\1$title/;print}print;while (<>) {print}' $fname
Tcl/Tk での画像の1ピクセルへの色設定
-->Tcl:
$img_id put $col -to $x $y
-->C:
-->a.
photo_handle=Tk_PhotoFind(interp, img_name);
Tk_PhotoGetBlock(photo_handle, photo_block_ptr);
-->b.
setp(photo_block_ptr, x, y, rgb);
-->unsigned char *pixelp=(b->pixelPtr+y*(b->pitch)+x*(b->pixelSize));
*(pixelp+(b->offset[0]))=(unsigned char)(*(rgb+0));
*(pixelp+(b->offset[1]))=(unsigned char)(*(rgb+1));
*(pixelp+(b->offset[2]))=(unsigned char)(*(rgb+2));
-->c.
Tk_PhotoPutBlock(photo_handle, photo_block_ptr,
0, 0, photo_block_ptr->width, photo_block_ptr->height);
-->a. を最初と c. を最後にのみ行うようにして b. をループで呼び出す
ようにすると Tcl 版をループで行うよりも多少速いようだ
(Tcl:30sec, C:19sec, 画像サイズ:320x320).
Tcl/Tk のリスト操作 C 関数ソースのありか
-->generic/tclListObj.c
generic/tclCmdIL.c
generic/tclUtil.c
tcl/tk で scale ウィジェットなどに -command でコマンドを割り付ける場合
は生成時でなくあとから configure を使ってのほうがいいみたい.生成時に
これを行うと一つの scale を生成するたびに割り付け分が呼び出されるため.
-->configure する前に update でキャッシュ分を表示させておく必要があ
る.
Tcl/Tk へ C から値を設定する.
-->Tcl_SetVar, Tcl_SetVar2: 後者は配列用
-->Tcl_SetVar(Tcl_interp *interp, char *name, char *value, int flags);
Tcl_SetVar2(Tcl_interp *interp, char *name1, char *name2,
char *value, int flags);
-->配列用に(?) Tcl_ObjSetVar2 というものもあるらしい
-->こちらだと文字列ベースでなく処理するので高速?
-->Tcl_SetVar は 次のものといっしょ.
Tcl_SetVar2(interp, name, NULL, value, flags|TCL_PARSE_PART1)
-->from. generic/tclVar.c
-->これを使って設定してみようとしたがむちゃむちゃ時間がかかる.
-->やろうとしたのはつぎのもの
set plot_points {}
set points_ymax 600
for {set x -600} {$x&lt=600} {incr x 30} {
for {set y 0} {$y&lt=$points_ymax} {incr y 70} {
for {set z -100} {$z&lt=1200} {incr z 30} {
lappend plot_points [list $x $y $z]
}
}
}
-->Tcl でやれば1秒で済むんだが,C で同じことをやると10分かかる??
-->前者が速いのは Tcl コンパイルの威力なのか?
-->Tcl_SetVar でなく Tcl_Eval に直接 Tcl スクリプト(lappend の箇
所のみ)を与えてみたが時間は変わらんかった.
-->リストへの追加が進行するにつれ徐々に遅くなるみたい.
-->for ループの中では Tcl_Eval("set foo(%d) {%d %d %d}") の形で
配列への設定にしておいて,ループを抜けた後にこれをリストへ変
形するとほとんど時間を食わないらしい.
-->こちらだと3秒.まだ Tcl ベースのものに比べると遅い.
-->しかし,'set foo_list [array get foo]' とすると配列のインデッ
クスまでもリストに含まれてしまう.どうすればよいか?
-->Tcl_DString を使ってリスト設定を行う長い文字列を作成し,ルー
プを抜けてからそれをそのまま Tcl_Eval すればいいらしい.これ
だと時間はほとんど一緒のようだ.
-->see.
http://www.geocities.co.jp/SiliconValley/4137/candtcl5.html#dstring
可変長文字列 DString を使ってリストを作る方法
-->方針を変更し,Tcl/Tk 側でリストを検索し,C 側では単一点の変換
のみを行うようにした.これだと (Tcl/Tk:7sec, C:3sec) となった.
多少は速いが,もっと速くなると思う.変換結果を C 側から文字列
として渡しているが,このときに %6.3f と固定になっているので,
不必要に文字数が増えてメモリを食ってしまってるのではないだろ
うか.
-->実際,画像座標を %6.3f で渡していたのを本来の %d へ補正した
ら,動作速度が向上した.
-->Tcl/Tk 側へ渡すデータは精度は無視して int 型とすることでい
いのかもしれない.もちろん精度無視を意識していないとおかし
いことになる可能性もある.
-->name: 変数名.'{}' で括るとインデックスになる(連想配列用?)
-->name1: スカラ変数名か name2 が非 NULL なら配列変数名
-->name2: 要素名?
-->flags:
以下の動作指示子を OR でつないで指定する
TCL_GLOBAL_ONLY
TCL_NAMESPACE_ONLY
TCL_LEAVE_ERR_MSG
TCL_APPEND_VALUE
TCL_LIST_ELEMENT
TCL_PARSE_PART1
-->GLOBAL_ONLY と NAMESPACE_ONLY が同時に指定された場合は後者が優
先されるらしい.動作は何が違うんだろ?
-->コロン '::' を使って特定の名前空間を指定できる??
-->ex.
-->C program
#include &ltstdio.h>
#include &ltstdlib.h>
#include &ltstring.h>
#include &ltctype.h>
#include "tcl.h"
#include "tk.h"
int nnn(ClientData clientData, Tcl_Interp *interp,
int argc, char *argv[]) {
Tcl_SetVar(interp, "nnn_var", "foo.", TCL_LIST_ELEMENT);
return TCL_OK;
}
int Nnn_Init(Tcl_Interp* interp) {
Tcl_CreateCommand(interp, "nnn", nnn, NULL, NULL);
Tcl_SetResult(interp, "Nnn loaded.", NULL);
return TCL_OK;
}
-->Tcl script:
load libnnn.so nnn
nnn
puts $nnn_var
-->Makefile:
INCTCLDIR = /usr/local/include
CC = gcc
#CFLAGS = -g -Wall -I$(INCTCLDIR) -I/usr/X11R6/include -L/usr/X11R6/lib
CFLAGS = -O2 -I$(INCTCLDIR) -I/usr/X11R6/include -L/usr/X11R6/lib
SHFLAGS = -fPIC -shared
all:: libnnn.so
nnn.o: nnn.c
$(CC) -c $(CFLAGS) $(SHFLAGS) $?
libnnn.so: nnn.o
$(LD) -Bshareable -Bforcearchive $? -o $@
-->ex. results
-->"foo.", TCL_GLOBAL_ONLY => foo.
-->"foo.", TCL_NAMESPACE_ONLY => foo.
-->"foo.", TCL_LIST_ELEMENT => {foo.}
-->"foo.", TCL_APPEND_VALUE => foo.
"foo.", TCL_APPEND_VALUE|TCL_LIST_ELEMENT => foo.{foo.}
"foo.", TCL_APPEND_VALUE => foo.{foo.}foo.
tcl/tk でのセレクション法
-->前準備
-->ガワ
-->1. 'selection handle' でセレクションが行われる際に呼び出される
ハンドラを設定する.
selection handle _w_ _HandleProc_
-->_w_ は対象となるウィジェット名.
_HandleProc_ がハンドラ名となる.
-->2. 呼び出されるハンドラを作成する.このときの引数には
'selection handle' で設定したものに加え offset maxbytes の2
つが追加される.つまり何も引数を指定しない場合には呼び出し時
の引数は2つになる.このとき,引数の数がハンドラ設定時と異なっ
ていると呼び出しエラーとなるのではなく,セレクションが見つか
らない旨のエラーとなってしまうので,注意が必要.
proc _HandleProc_ {offset maxbytes} {return _SelectionData_;}
-->もしかすると引数の数を変えることで同一名の複数ハンドラを使
い分けることができるのかもしれん.そんなことはないと思うが...
-->3. イベントに応じてセレクトする.
selection own _w_
-->セレクション毎に名称をユーザが付けることができるらしい.X で一
般に使用されるセレクション名は PRIMARY.Tk では他に CLIPBOARD
が用意されているようだ.clipboard コマンドも参照のこと.
-->ex.
proc SelectHandle {offset maxbytes} {return "Selected";}
button .b -text S -command {selection own .b}
pack .b
selection handle -type TEXT .b SelectHandle
-->注意:
-->日本語版 Tcl/Tk ではセレクトタイプ名は COMPOUND_TEXT となるよ
うだ.ペースト時に kterm 側からは STRING, TEXT のみしかみない
ようなので,このままだとデータ転送されない.これを可能にする
には '-type STRING' などとして明示的に型を対応したものにする
必要がある(らしい).
-->英語版だとそのままの既定値で kterm 側へもペーストできるはず
なので,これは日本語化の副作用といえるものか,あるいは
kterm 側が悪いのかもしれん.でも,xterm へもペーストするこ
とはあるはずだからなぁ...Tk 側で COMPOUND_TEXT であれば
TEXT も指定されたとみなすほうが適切なのかも..??
-->entry ウィジェットでもセレクションはできて,上の -type オプショ
ンによる対応が不明だったときは,pack しない entry ウィジェッ
トへテキストデータを持たせてセレクトさせていて,こちらでペー
ストもできている.おそらく entry ウィジェットでは STRING の指
定 (NULL 指定時の既定値) となっているのではないか.
tcl/tk での selection の結果を他のアプリケーションにも渡そうとするなら,
データ型を日本語 tcl/tk の既定値である COMPOUND_TEXT でなく TEXT か
STRING を使わないといけないらしい.
-->例えば kterm へのペーストを行いたいとき.
-->なんで COMPOUND_TEXT になってるんだろ?entry ウィジェットのサブコ
マンドの selection では普通に kterm へ渡すことができる.entry か
らのデータ型は何になっているのか?
-->非日本語(英語)版のデフォルト設定は STRING のようだ.英語版と同
様に使用するには,'-type STRING' のハンドラの設定が常に必要なの?
-->tcltk-8.0.4jp1.4.patch からはセレクションの対応が変更になったそう
だ.
tcl/tk の selection handle でのハンドラ登録ではハンドラ関数への引数の
数があっていないとその関数の呼び出しすら行われないみたい.エラーメッセー
ジは「引数があっていない」ではなく,「セレクションがない」となる.
tcl/tk の foreach コマンドでは複数変数への値の代入がすぐにできるので,
便利.set コマンド(か別のもの)でも同様のことはできないか?
-->'foreach {$a $b} {1 2 3 4} {puts "$a $b"}' とようにして一度に $a,
$b に値を設定することができる.だから強引に実行部を空にして変数設
定だけに使うこともできるが,やっぱり気持が悪い...
-->次の proc を書いてみた.結構便利.
proc sets {{vars} {vals}} {
foreach var $vars {
upvar $var x
set x [lindex $vals 0]
set vals [lreplace $vals 0 0]
}
}
2次のBスプライン曲線は制御線どうしをつないだ直線が接線となる.3次の
Bスプラインはさらに離れた滑らかな曲線となる.Tcl/Tk は2次のBスプラ
イン曲線で描画する.
tcl でリストを逆転することはできないの?
-->次のような proc を組んでみた.
proc lreverse {{src}} {
set dest ""
foreach l $src {
set dest [linsert $dest 0 $l]
}
return $dest
}
xv の pics ファイルは P7 というヘッダがついているのだが,これは pnm フォー
マットにあるものか?tcl/tk キャンバスにこの画像を貼ることはできんのか?
-->goo で検索したら xv のソース (xvbrowse.c) が引っかかった.
"Thumbnail format" と呼んでいるらしい.xv 独自のフォーマットか?
-->xvpictoppm.c というソースも xv のパッケージにあるみたい.
Tcl/Tk で複数のスケールウィジェットをスクロールさせたい,という場合に
はキャンバスウィジェットの window アイテムを使って貼り込んでそのキャン
バスに scrollbar を付加する.
tcl/tk のキャンバスで,最後に空白/改行を含む text がある場合には,find
enclose しても,この text アイテムは検索されない.
tcl/tk キャンバスの line は端点の座標が重なっていれば polygon の扱いを
するようになるらしい.spline のスムージングをするとその端点が丸まる.
tcl/tk キャンバスの 'find enclosed x0 y0 x1 y1' ではテキストアイテムは
検出できない??
tcl/tk の wm コマンドのソースは tk*/unix/tkUnixWm.c にある.
「入門 tcl/tk」久野のまえがきに,「tcl は他の言語の補完として用いるこ
とを目的としたものだから,これで何百行ものソースを書き出したら方向性を
再確認する必要がある」というようなことが書かれてあった.でも,何百行も
書きそうな雰囲気だよなぁ...(^^;.お気楽ツールぐらいなら他の言語の登
場を必要とせずとも書けそうというか...
宮田・芳賀の「Tcl/Tk プログラミング入門」では tk キャンバスの曲線補間
を「ベジエ曲線」として紹介している (p.140).そのすぐ下の項に
'-splinesteps' オプションの説明もあるというのに...スプライン曲線な
んでしょ?
-->2次のBスプラインらしい.「実習グラフィックス」(佐藤,アスキー)
の例と制御点を同じ配置にして曲線の様子を確認 (p.154).
-->スプラインは制御点を通過する.Bスプラインはその近くを通過する.
-->3次スプラインの各スプラインは3次ベジエ曲線に同じという説明が
あるなぁ.
see. http://www.truetype.demon.co.uk/ttoutln.htm
TrueType's curves are quadratic B-splines. Each spline is
equivalent to a series of quadratic Bzier courves.
Tcl/Tk のウィジェットサンプルは,「お,こんなことができるのか!?」と
感動するのには適当だけど,「じゃあ実際に似たものを作ろう」というのには
適当でない.まとまり過ぎのサンプルなので,サンプルコードを見ても個々の
機能がどこで実現されているのか見つけにくくなっている.バルーンヘルプ並
の各要素に対する分割コード表示をしたほうがいいのではないか.
Tcl/Tk のキャンバスで,網目かけをするには各アイテムに対して -stiple オ
プションを適用する.
-->ex. widget サンプルの例
'-stipple @[file join $tk_library demos images gray25.bmp]'
-->指定ビットマップパターンは網目に限らず,任意の模様で良い.
-->stipple されるビットマップの絶対座標は固定で,それを fill による
窓から覗いている感じになる.
ウェルチの「Tcl/Tk 入門」に,2種類のスライダを持つスケールの例がある.
これはキャンバスウィジェットを使って作成されていた.新しい機能を持つ部
品を作成しようとすると,キャンバスウィジェットを使うことになるのか.
tcl/tk のウィンドウアイコンの指定 'wm iconbitmap' は XBM (bitmap) 形式
しか使えないようだ.gif などの image も扱えるようになればいいのに.
-->さらに bitmap 形式はファイル名 '@filename' でしか指定できない?
-->wm 以外の button ウィジェットなどでは '-bitmap' 以外に '-image'
属性も持っており,こちらには image で生成したデータを指定可能.
button の場合でも '-bitmap' だとデータは指定できないようだ.
-->bitmap のデータ形式がわかっていないだけ??
tcl/tk のキャンバスウィジェットの postscript コマンドに出力時のスケー
リングオプション '-scale' があればいいのに.
tcl/tk のキャンバスウィジェットでのフォント表示では,英フォントであれ
ば -font オプションに '[list フォント名 サイズ]' とすることで表示サイ
ズを任意に変更できる.しかし,a14 などの日本語(固定幅?)フォントを使っ
ていると 'font create' でフォントを新規生成しないとサイズにあったフォ
ントを使用できない.これは生成に時間がかかるし,X サーバにも負担がかか
るようだ.どうにかできんのか?
-->X-tt を使う?
tcl/tk のキャンバスから出力される Postscript ファイルは fixeucfont コ
マンドで変換しないと,LBP730PS では印刷できない.CID フォーマットに関
連するものらしい.
-->http://www.rd.nacsis.ac.jp/~katayama/homepage/fixeucfont/
-->8.0.4jp1.3.patch で対応された.
tcl/tk の text ウィジェットで現カーソル位置に文字を挿入するには.
-->insert コマンドを使って insert というマーカ位置を指定する.
.t insert insert "string"
Tcl/Tk でトップレベルウィジェットを pack した順に生成していくには,
pack してすぐに update を実行する.
Tcl/Tk のキャンバスウィジェットを PostScript 出力すると微妙に縮小され
る.
-->'500 450' の幅を出すと '502 452' となる?
-->どちらも 2 の増加というのが怪しい..何倍とかじゃないのか?
-->1.004 倍して四捨五入している?
-->出力 PS のなかに '0.9589 0.9589 scale' の行があるなぁ..
-->Tcl/Tk キャンバスの PS 出力と他の EPS の位置合わせには '2 2
translate' のずれを考慮しないとダメ?
-->'-10 -7 translate' する必要がある??
-->次のようにする
.3161 .2886 translate 0.9589 0.9589 scale
または
0.9589 0.9589 scale .3031 .2767 translate
-->これは実際には次のような処理になっている(第1行目の -65 の部分
はゼロ点合わせで付け加えるもの).
-65 -179 translate
306.0 396.0 translate
0.9589 0.9589 scale
-251 -226 translate
-->だから等倍で出そうとscale 部分をコメントアウトすると
(-10=-65+306-251,-9=-179+396-226) のずれになる.
Tcl/Tk の canvas:postscript コマンドって貼り込んだ画像には対応してない
みたい.どうにかならんのか.
Tcl/Tk の canvas の image ってちゃんと GIF の透明色指定に対応してる.
貼ると下が透けて見えた.なんか感動...
Tcl/Tk のバージョン表示は 8.0.3 であっても 8.0 とかにしかならない(例:
インストールディレクトリ,$tcl_version 変数).これだと,どの版を使っ
ているのか混乱することがある.さらに,この表示からは日本語化されている
かどうかも不明だ.どうにかならんのか?
Tcl/Tk では,文字列のチェックを行うには if だと [string compare $str1
$str2] を逐次使わなければならない.これでは煩雑である.
-->switch コマンドを使うのが常道??
-->switch $str1 {
$cond1 { body }
$cond2 { body }
* { error_body }
}
tcl/tk のキャンバスでドラッグ&ドロップするには.
-->キャンバスアイテムの下に何があるかは "$canvas below $id" で得るこ
とができる
tkstep を使えば,tcl/tk でドラッグ&ドロップできる
-->http://www.aaa-int.or.jp/~jfactory/softlabo/TkStep/bank/Tk8.0p2jp-TkStep8.0p2jp.patch.gz
-->コンパイル時に ENABLE_DND オプションが必要
-->例:
label .label -text "Drag & Drop"
pack .label
bind . &ltDrop> {puts "Got a Drop!"}
bind .label &ltDrag> {dnd_setdata Text "Hello, I'm TkDND!!!!"; dnd_handledrag trek
-->Canvas オプションのアイテム同士でのドラッグ&ドロップはどうすんの
か?
-->アイテムに &ltDrag> のバインドはできるようだが, には反応し
ない.ベースになっている canvas に &ltDrop> をバインドするのか?
-->サンプルファイルがある
see. /usr/local/lib/tkstep/demos/{dragtest,droptest}
tcl/tk でのファイルの双方向入出力は fileevent を使うらしい.
-->see. "", {田口},Software Design, 10, 1996.
-->双方向入出力には socket コマンドを使うみたい.fileevent はファイ
ルストリームがアクセス可能かどうかをチェックするのに使うらしい.
-->socket ホスト名 ポート番号
socket -server コマンド名 [ポート番号]
-->でも,perl の open2 で標準入出力を割り当てるのとは違うんだな,こ
れは.tcl 版の open2 を探さんといけんのかな?
-->open コマンドで "r+" オプションをつけると読み書き両用で開くことが
できるみたい(で,おそらくこれまでも何度か試しているはず).だが,
あいて側の出力で標準出力に対して flush をかましてくれてないと読み
込みで動作が停止してしまうようだ.
-->gnuplot などの flush をしないコマンドについてはどのように扱えば
いいのか?
-->Expect という拡張 Tcl ではこういう対話型プログラムが組みやすくなっ
ているらしい.
「Tcl/Tk プログラミング入門」の図形エディタの例題プログラム zskeletn5
は,線を引く機能として,単線と折れ線の2つが別になっている.これだとお
絵描きで線画を描くのにも便利だ.
tcl/tk で画像表示
-->set img [image create photo -file "foo.gif" -format gif]
set width [image width $img]
set height [image height $img]
canvas .c -width $width -height $height
pack .c
.c create image 0 0 -anchor nw -image $img
C から Tcl/Tk ライブラリを使用するときは,シェアードライブラリをインス
トールしておいて,それをリンクするようにすること.そうでないと 1MB 以
上の実行ファイルが作成されてしまう.シェアードでは 8KB ほどで済む.
tcl/tk: listbox は イベントは受け取れんのか? frame あたりで括る
必要がある?
-->frame も &ltKey> は受け取れんよ..トップレベルウィンドウでしか受け
取れないのかも.
tcl/tk はフレームへの名前付けに苦労するな.単に個別ウィンドウをまとめ
たいときだけに使うフレームなんて名前いらんよ..
-->lisp の無名関数のような機能があればいいのに.
tcl/tk で listbox の内容を更新するには?
-->$lb insert $id $text
$lb delete [expr $id+1]
-->先に delete $id してしまうと最後のリスト項目が表示できなくなる.
tcl/tk と Emacs/Mule とで連携処理はできんのか?
-->tcl/tk でエディタ処理が必要な場合そこは Emacs/Mule に任せたいのだ.
tcl/tk での割算で小数点以下の値を得るにはどうするの?
-->これでいいのか?↓
0 : expr 350/1600
0.218: expr 350*1000/1600*.001
tcl/tk のリストボックスは,表示ラベルの改行は空白へ変換してくれるのだ
な.
tcl/tk では send で情報のやり取りが可能らしい.これを使えば perl でい
う open2 のような機能を実現できるか?
Tck/Tk はシャープ # でのコメントアウト後でもブレース } があるとこれを
認識してしまう?
-->次のようにするとエラーが発生する.
proc foo {{w} {a}} {
#}
#proc bar {{w} {a}} {
puts "$a"
}
foo . "test"
-->エラーメッセージ
can't read "a": no such variable
while executing
"puts "$a..."
(file "a.tcl" line 4)
-->仕様らしい.
「解釈の順番 コメント文の解釈は,文がワードに分解された後で解釈さ
れることに注意して下さい.(中略)コメントの解析はコマンドプロシー
ジャで行われるためです.」
(Tcl/Tk プログラミング入門, 宮田・芳賀, p.12)
-->むー,不便じゃないか?これ.
tcl/tk の Canvas ウィジェットでは,create した順に上書きされる.確かこ
の順序を変更することはいまのところできなかったと思う.
-->see. tcltk-faq
-->変更可能だった._canvas_ {raise|lower} _id_ とすればよい.変更で
きないというのは,_id_ の順序関係のことか?
tcl/tk の radiobutton は設定した変数の値が変わるとアクティブも自動でそ
れに対応する.
tcl/tk での動画グラフィックでは for 文などで連続的に変化させるのではな
く,update を使って更新関数を自己呼出させるのが常道らしい.
-->例:tkstars
-->X ではある程度の命令が溜るまでキャッシュするから??
Mule のなにかのバッファでシャープ # でのコメントの行に記述してるときに,
行分割が行われると,新規行の頭に自動で # が付加された.どいつの仕業な
のかな?
-->どのモードだったかも定かじゃない.tcl-mode だったかも.
-->ビンゴ!.tcl-mode で # 行を編集していると auto-fill による分割
時に新規行にも # が付加された.
-->comment-start という変数がキーらしい.他の言語モードでもこの設定
を行なっている.でも,この変数を実際に処理しているのがどこかがわ
からない.allout.el というアウトラインパッケージか?
tcl の if 文って "if {}{}" とブレース同士をくっつけてしまうとエラーが
出る."if {} {}" とせねばらなんようだ..変なのー.
-->tcl では「if 文」ではなく「if コマンド」として実装されているため,
引数を2つ必要とする.だから明示的に空白を入れなければならない.
-->global と upvar の違いって何?
tcl の if 文で AND 条件を表すにはどうするの?
--> '{{foo} && {bar}}' とすればいいのか(c.f. expr)?
-->'{(foo) && (bar)}' が正解(丸カッコを使う)
tk でスペースキーをバインドするのはどうやるの?
-->'bind . &ltSpace> {foo}' は効かない.
-->'bind . &ltKey-space> {foo}' とする
-->c.f. http://slwww.epfl.ch/SIC/SL/logiciels/TclTk/COURS/TclTk_cours_tk.html
||
Tcl/Tk 入門||