●●●●TCL/TKなら俺に聞け 2●●●●
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/05/01(火) 14:52:44プロジェクト本拠地
http://tcl.sourceforge.net/
最新版ソースコード
ftp://ftp.tcl.tk/pub/tcl/nightly-cvs/
The Tcler's Wiki
http://wiki.tcl.tk/
The comp.lang.tcl Newsgroup
http://groups.google.com/group/comp.lang.tcl/
ActiveTcl
http://www.activestate.com/products/activetcl/
【日本語サイト】
もっとTcl/Tk
http://www.interq.or.jp/japan/s-imai/tcltk/
Tcl/Tk Scripting Laboratory
http://www.geocities.jp/urano343/tcltk.html
Tcl/Tk Primer
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/tcltk_primer/
Tcl 8.4.1 Manual Command Reference
http://www.freesoftnet.co.jp/tclkits/doc/TclCmdRef/tcl_contents_jp.htm
CategoryTclTk - mynote
http://reddog.s35.xrea.com/wiki/CategoryTclTk.html
【前スレ】
●●●●TCL/TKなら俺に聞け●●●●
http://pc11.2ch.net/test/read.cgi/tech/1033628416/
0261本田
2008/05/25(日) 06:00:16http://cpptcl.sourceforge.net/
>A C++ library for interoperability between C++ and Tcl
>C++/Tk
http://cpptk.sourceforge.net/
>A complete C++ interface to the Tk GUI toolkit
0262デフォルトの名無しさん
2008/05/29(木) 20:12:22パッチとか修正とか、かなり手を入れないと使えないのでしょうか。
0263デフォルトの名無しさん
2008/06/02(月) 21:39:25ここにその議論がある。http://wiki.tcl.tk/2157
要するにsplitすればよい。ただし連続する空白文字に対する動作が意図と異なるかもしれない。
while {[gets $ch line] >= 0} {
puts [lindex [split $line] 0]
}
あるいは、
puts [join [split $line] |]
などに書き換えて様子を見よう。
>>262
Windows版の場合、tcl84.dllに直接リンクしてしまってるからどうにもならないよね。
Tcl8.3あたり以降のextension作成のガイドラインから外れた古い作りになっているんだろう。
実際何年も更新されてないようだし。
自前ビルドしてやるしか。
0264262
2008/06/03(火) 11:42:06http://jos.decoster.googlepages.com/bltfortk8.5.2
を基に試してみました。
demosやexamplesの一部 (多く?) が失敗するけど、なんとなく使えそうです。
BLT-3.0で対応するのかなぁ。
0265デフォルトの名無しさん
2008/06/14(土) 18:22:11これは試した?
0266262
2008/06/16(月) 16:43:53Fedora 9で試してまして、そうこうしてるうちに、>>263の方法で対応したパッケージがリリースされました。
https://bugzilla.redhat.com/show_bug.cgi?id=446862
で対処してくださったようです。
0267デフォルトの名無しさん
2008/06/20(金) 19:54:08また、できれば選択した文字列が表示されるテキストボックス部分を
複数行表示にしたいのですが、可能でしょうか?
0268デフォルトの名無しさん
2008/06/20(金) 21:03:00tile拡張のttk::comboboxのやつか?
ttk::combobox .cb -width 100 とかでいけんじゃね
>>複数行表示にしたいのですが、可能でしょうか?
不可能じゃね
0269デフォルトの名無しさん
2008/06/27(金) 03:20:15set a hoge
set b a
set c b
とやって、cからたどってhogeに辿り着くには
どうすればいいのでしょうか。
$$$c とか $[$[$c]] とかいろいろやってみたのですが
できません……。
0270デフォルトの名無しさん
2008/06/27(金) 22:53:22set b a
set c b
proc aho foo {
upvar $foo bar
return $var
}
puts [aho [aho $c]]
0271デフォルトの名無しさん
2008/06/27(金) 23:22:33puts [set [set $c]]
>>267
2行は無理。BWidgetsのコンボを改造すればできるかも
0272デフォルトの名無しさん
2008/06/28(土) 00:44:17へ〜、setって変数の参照にも使えるんだ。 勉強になりますた。
0273デフォルトの名無しさん
2008/06/28(土) 03:31:47> ただし連続する空白文字に対する動作が意図と異なるかもしれない。
この制約がどうにも辛いです。
連続した空白があってもそれをただ一つの区切りとみなしつつ、
安全にファイルなどから読み込んだ文字列を処理するには
どうしたらいいのだろうか。
0275デフォルトの名無しさん
2008/06/28(土) 06:01:58そんなの教わったregsub使えよ
while {[gets $ch line] >= 0} {
puts [lindex [split $line [regsub -all -- {\s+} $line { }]] 0]
}
0276デフォルトの名無しさん
2008/06/28(土) 12:50:19set line {He said "I am}
foreach word [string map {\" \\"} $line] {
puts $word
}
0277デフォルトの名無しさん
2008/06/28(土) 14:34:54'{' inside string
0278デフォルトの名無しさん
2008/06/28(土) 17:20:38必要がない時の条件がよく分からん。。。
あと、ファイルから読み込んだ行を一律regsubしてしまって
常に構わないのかどうかも。。。
0279デフォルトの名無しさん
2008/06/28(土) 21:56:13文字列をリストに自動変換してるところは気にしろ。文字列をforeachしたり
リスト系のコマンドに直接文字列を渡したりしてるところは注意だ。
>>276
set line "He said \"I am \{ a boy \}"
foreach word [string map {\" \\\" \{ \\\{ \} \\\}} $line] {
puts $word
}
0280デフォルトの名無しさん
2008/06/28(土) 23:10:12これは必要? あってもなくても同じではないの?
0281本田
2008/07/01(火) 06:46:34>Tcl/Tk 8.6a1 June 25, 2008
>Tcl/Tk 8.4.19 Apr 18, 2008
http://www.tcl.tk/
0282263
2008/07/02(水) 07:53:23そもそもの話をしてもいいだろうか。
こんなコードは試しましたか?
set lines {He said "I am
a boy"}
set i 0
foreach l $lines {
puts $i:$l
incr i
}
Tclのlist「形式」は平易ながらバイナリデータまで扱える立派な「データ構造」なので、
まともに実装しようとすればTclが最初から持ってるパーサーを実装しなおすようなことになるよ。
平易ではあるがあまり(書いたソフトの)ユーザーには触ってもらいたくないデータ形式のような気がする。
コメントも使えないしね。自分自身で読み書き保存するためにはいいけど、
ユーザーに触らせるならJSONやYAMLなどのより一般的な形式がいいだろうね。
今ならtcllibのCVS HEADにライブラリが置かれてるよ。
0283239
2008/07/02(水) 09:03:58>>282
それじゃ根本的に違うんだよね〜
getsで一行ごとにテキストファイルから読んでるの文字列に「"」があるのがミソなんで
set lines {He said "I am}
を処理することになるんですよ。
0284デフォルトの名無しさん
2008/07/02(水) 19:51:00string is list $strが追加されてんぞ。
0285デフォルトの名無しさん
2008/07/03(木) 00:00:27そもそもデータ自体が1行ずつ処理されるように書かれていないのになぜ、1行ずつ
処理したがるのか
0286デフォルトの名無しさん
2008/07/03(木) 01:29:080287デフォルトの名無しさん
2008/07/03(木) 01:43:11flex/bisonでやるか PureTclでやるならfickle/taccle
0288デフォルトの名無しさん
2008/07/04(金) 11:09:03自分の描画ルーチンが重いのではなく、Tkがcanvasをリフレッシュするのが激重です。
描画したアイテムを選択して移動とかするつもりはなく、単に絵が表示されればいいのですが…
こんな場合は、image photoに直接力技で図形を書いていくしかないですかね。
0289デフォルトの名無しさん
2008/07/05(土) 12:36:31書いた絵をドラッグできるとかそういう系。
0290本田
2008/07/06(日) 13:21:30Zinc Is Not Canvas!
http://www.tkzinc.org/tkzinc/index.php
OpenGLが、速い環境が無いと、遅すぎてかなわん。
0291デフォルトの名無しさん
2008/07/07(月) 21:37:100292デフォルトの名無しさん
2008/07/08(火) 00:37:160293デフォルトの名無しさん
2008/07/09(水) 07:59:32>>292
1000を超える描画単位(図形やウィジェットなど)をリアルタイムで取り扱うことはスクリプト言語系のツールキットでは想定されてないと思う。
素直にネイティブコードで動く言語で実装したほうが早いんじゃない? 描画結果のキャッシュでもしつつ。
0294デフォルトの名無しさん
2008/07/09(水) 20:18:400295デフォルトの名無しさん
2008/07/09(水) 22:18:260296デフォルトの名無しさん
2008/07/09(水) 23:06:430297デフォルトの名無しさん
2008/07/09(水) 23:44:51非同期で走っている複数のスレッドから進行状況や終了などをメインのスレッドで
受け取るにはどういう手段があるんでしょう? tsv でスレッド内で状況をセットして
メインでpollするというぐらいしか思いつかないのですが。 メインの方で
vwaitしてスレッドのほうからthread::sendなんて出来ませんよね?
0298デフォルトの名無しさん
2008/07/10(木) 06:48:22Tcl_Eval()でTclスクリプトを実行したときにそのスクリプトにエラーが含まれていると、
エラーメッセージはResultの中に入ってる。
これをResultの代わりにエラー出力に出したいんだが、その方法がよくわからない。
やり方があるようなら教えてもらえないだろうか。
0299297
2008/07/10(木) 06:54:59Expectを多用してるので諦めます。
http://community.activestate.com/forum-topic/expect-tcl-threads
0300本田
2008/07/10(木) 07:54:03http://wiki.tcl.tk/2620
stderr is one of the stdio output files opened
- applications and functions tend to use it for the output of error messages.
0301298
2008/07/10(木) 10:32:22ご協力ありがとう。
読んでみたけどどうやらこれはTclインタプリタ側(Tclスクリプト側)から
外部コマンドを呼び出したときのstderrについて議論しているみたいで、この話とはちょっと違う。
Tcl_CreateInterp()でinterpを作った後、
Tcl_SetStdChannel(channel, TCL_STDOUT);
Tcl_SetStdChannel(channel, TCL_STDERR);
を呼び出すことでinterpが呼び出すputsコマンドによる標準出力、エラー出力をトラップできることは確認できている。
だがTcl_Eval()やその他のTcl変数を直接いじるAPIを呼び出したときの文法エラー、実行時エラーは出力されないみたいなんだ。
(で、Resultの中に入っている)
こいつを、他と同じようにトラップできればいいんだが……。
0302デフォルトの名無しさん
2008/07/10(木) 11:44:58>>299
http://www.tcl.tk/doc/howto/thread_model.html
0303デフォルトの名無しさん
2008/07/10(木) 14:59:25TCL_ERRORだったらResultを出力すればいいだけじゃね?
0304デフォルトの名無しさん
2008/07/10(木) 22:13:52なんでそんなことそをする必要があるかもう少し詳しく書いた方がいいぞ。そうしないと、
>>303みたいにすりゃいいだろ思うんだが
if (Tcl_Eval(interp, script)!=TCL_OK) {
char str;int len;Tcl_Channel e=Tcl_GetStdChannel(TCL_STDERR);
str=Tcl_GetStringFromObj(Tcl_GetObjResult(interp), &len);
Tcl_Write(err,str,len);Tcl_Flush(interp,err);
}
0305304
2008/07/10(木) 22:23:390306本田
2008/07/22(火) 20:12:44NEXTSTEP(tm)-lookalike-wanabee-hack-kit for Tk
Alfredo K. Kojima
tkstep0.3b3.tar.gz
tkstep8.0.4-2.tar.gz
Alfredo Kojima
http://en.wikipedia.org/wiki/Alfredo_Kojima
Alfredo Kengi Kojima
http://si3.inf.ufrgs.br/informa/Edicao12/entr_ago00.htm
TkSTEPは、現在、開発がストップしてるけど、
windowmakerなど他の仕事で作者は有名なんだな。
0307本田
2008/07/23(水) 01:18:22http://www.hping.org/tclircd/
The Tcl IRCd is an IRC server written in the Tcl language.
The current version is not a complete implementation of the IRC protocol
but should interoperate well with most IRC clients, and allows to register,
change nick, create channels, talk on a public channel or in query and so on.
The program is small,
less than 500 lines of code, and was written in order to be very simple to modify/extend.
0308デフォルトの名無しさん
2008/07/24(木) 04:12:370309デフォルトの名無しさん
2008/07/24(木) 20:37:58set map [namespace ensemble configure string -map]
dict append map hello stringHello
namespace ensemble configure string -map $map
string hello
ただし8.5以上。
8.4のときはstringコマンドをtcl_stringなんかに名前を変えて
そのうえでそれのラッパーのstringを作ったりしてた。
0310デフォルトの名無しさん
2008/07/24(木) 23:57:42>$$$c とか $[$[$c]] とか…
puts [subst $[subst $[subst $c]]]
遅レスだが…
0311デフォルトの名無しさん
2008/07/27(日) 18:35:14$$var (間接指定)について
http://psg.com/%7Ejoem/tcl/faq.html#DoubleIndirect
に丁寧な説明がある。
古い我家頁だが、今でもアクセス可能と思う。
0312デフォルトの名無しさん
2008/07/29(火) 00:59:08いきなり消滅してて悲しい・・・
0313デフォルトの名無しさん
2008/08/02(土) 08:48:510314デフォルトの名無しさん
2008/08/05(火) 04:33:00暗号化したいがどうすればよいでしょうか?
0315デフォルトの名無しさん
2008/08/05(火) 21:26:28http://home.netyou.jp/22/tanida/MazeOfProgram.htm
隠ぺいのためになるかは不明.
0316デフォルトの名無しさん
2008/08/11(月) 10:37:56相手が何も返してこないと、一生待ちつづけてしまうのですが、
タイムアウトさせたりする方法は無いですか?
0317デフォルトの名無しさん
2008/08/12(火) 07:07:15Tcllibは調べた?
0318デフォルトの名無しさん
2008/08/12(火) 08:05:26fconfigure -blocking
fileeventで非同期に処理するのが良いと思う
0319デフォルトの名無しさん
2008/08/13(水) 20:58:560320316
2008/08/14(木) 09:50:55fileeventがまさに探していた機能です
サンクスコ
>>319
それは考えたけど、一度発行したgetsを取り消す術がないからダメポ
0321デフォルトの名無しさん
2008/08/24(日) 00:56:41のlsearchとかlreplaceとかで、ネストタグの抽出が簡単にできるのが良い。
perlより全然良い。日本語が問題なく使えるのが良い。簡単GUIも良い。
foreachの中のregexpが速ければもっと良い。なかなか最適化ができない。
0322デフォルトの名無しさん
2008/08/24(日) 01:10:160323デフォルトの名無しさん
2008/08/24(日) 02:59:06TclはJITに対応してるという記述がちらほら(wiki.tcl.tk含む)で見かけたので
ソースコードを調べたら、スクリプトを内部表現に書き換えるコンパイラはあっても
CPUのニーモニックに直接変換してる実装部分は見当たらなかった。
インタプリタ自体がやってることはそれほど複雑ではないので(ほとんどがコマンド自体の実装)
誰か実装してくれればいいなとは思うが、
googleのannualのフォーラムでの議題には特にあがっていないようだ。
0324デフォルトの名無しさん
2008/08/24(日) 09:13:12そもそも
コマンド 引数 引数 ...
しかなくて、構文などというものもない簡易言語に期待しすぎでしょ。
0325デフォルトの名無しさん
2008/08/24(日) 22:12:31それはさておきTclでバイトコードコンパイルしてるってのだけで驚異的じゃない?
Tclって意味論的には素直に考えるとevalに満ち溢れたような代物でしょ。
0326デフォルトの名無しさん
2008/08/25(月) 00:18:54処理速度を要求される部分はCで作った方がいいでしょ、マジで。
0327デフォルトの名無しさん
2008/08/25(月) 01:11:39それはTclのシンタクスとは直接の関係はないし、Tclが簡易言語とも思わないけど。
0328デフォルトの名無しさん
2008/08/26(火) 00:03:21Enter押すまで入力待ちになってしまいます。
機種依存が必要であればlinuxでお願いします。
proc getch {} {
return [read stdin -nonewline]
}
目的は簡易lessコマンド作成です。
0329デフォルトの名無しさん
2008/08/26(火) 00:10:49tclはねぇ、ローカルスコープ切れないからちょっとプロシージャが長くなると変数がゴッチャになるのよ。
長いもの書くには向かないと思うがね。
0330デフォルトの名無しさん
2008/08/26(火) 00:44:05最新版はついに起動できなくなったwww
動的に拡張を読み込めるのがTclの利点なのに、一つの実行形式に使わない拡張までまとめないで欲しい・・・
0331デフォルトの名無しさん
2008/08/26(火) 01:37:04Tclなめんな!
proc block {body} {
eval $body
}
set x 100
set y 1000
block {
set x 200
upvar y y
puts "value is $x $y"; # value is 200 1000
}
puts "value is $x $y"; # value is 100 1000
0332デフォルトの名無しさん
2008/08/26(火) 01:41:54http://wiki.tcl.tk/14693
まあこれを読め
http://tcllib.sourceforge.net/doc/receive.html
そして次はこれだ
0333デフォルトの名無しさん
2008/08/26(火) 03:33:43ありがとうございます。
解決しました!
0334デフォルトの名無しさん
2008/08/26(火) 17:03:54blockがたくさんネストしたらどこまでupvarしたらいいかわかんなくなっちゃうね。
0335デフォルトの名無しさん
2008/09/08(月) 13:49:03encoding systemがwindowsではcp932, Linuxではutf-8となっていて、
スクリプトを書くさいにそれぞれの文字コードで保存せねばなりません。
(string bytelengthはいずれの環境も一緒になるので内部ではutf-8のようですが)
ですので、windowsで作ったスクリプトをそのままLinuxに持っていくと文字化けしてしまい困っております。
encoding systemをcp932やutf-8に強制的にセットしたところで上手く動きません
(windowsでencoding system utf-8にし、スクリプトをutf-8で保存しても文字化け、等)
encoding systemの異なる環境間で同一スクリプトで動かす手立てはないものですかね。
0336デフォルトの名無しさん
2008/09/08(月) 20:35:030337デフォルトの名無しさん
2008/09/10(水) 03:14:41もし8.5を使ってるんだったら、、sourceやtclshやwishに-encodingオプションが付いたから、
スクリプトはcp932で書いておいて、最初の3行を
#!/bin/sh
# the next line restarts using tclsh \
exec tclsh -encoding cp932 "$0" "$@"
にすることで、できたりしませんか?
逆に、スクリプトはutf-8で書いておいて、
windowsの関連付けの方で、wishに -encoding utf-8を付けるという手もあるかも。
試せないので、無責任に書きっぱなしですいません。
ところで、スクリプトをwindowsからLinuxへ持っていくときに
nkf通して変換というのじゃ駄目なんでしょうか。
0338デフォルトの名無しさん
2008/09/10(水) 07:12:11shift-jisで書いておいて
#!/bin/sh
# \
LANG=ja_JP.SJIS; export LANG; # \
exec tclsh "$0" "$@"
で動くかもしれないし、動かないかもしれない。
0339335
2008/09/10(水) 10:06:33よくわかりません。
>>337
8.4使っているのですいません。
(ActiveTclの拡張が8.5では少なすぎるので)
Linux側で修正したりwindows側で修正したりしたのを日付で同期してるのでnkfやiconvは使いにくいですね。
>>338
凄いぜ。
putsでターミナルに出力する文字は化ける(konsoleのモードがutfだからしかたない)が、
widgetに出力する文字はきちんと出たよ〜。
0340デフォルトの名無しさん
2008/09/10(水) 20:07:26puts \u0055\u0069\u0063\u006f\u0064\u0065\u30ea\u30c6\u30e9\u30eb\u304f\u3089\u3044\u3050\u3050\u308c
それはさすがに嫌杉でしょw
0342デフォルトの名無しさん
2008/09/10(水) 23:21:08putsは fconfigure stdout -encoding utf8 とかで化けなくなると思う。
でも、そこまで文字コード意識するならWindows<->Linuxでコピーする時に変換するほうが良いんじゃないの?
最近ActiveTcl8.5.4に乗り換えたけど一見拡張が入っていないように見えて、実は Tcl\lib\teapot\package\ 以下に
入っているように思った。
0343デフォルトの名無しさん
2008/09/11(木) 21:48:49この技はおぼえておけ。かならず役に立つときが来る。
0344デフォルトの名無しさん
2008/09/12(金) 22:20:20>>342
ActiveTcl8.5.x のインストーラの最初の画面で、
8.5は8.4とほとんど互換性があるから、
teacupを使うか8.4に上書きインストールしたら
たくさんのパッケージが手に入る。
というようなことが書いてました。
まだ8.5に乗り換える気はないんで、それだけ見てキャンセルしたけど。
0345デフォルトの名無しさん
2008/09/17(水) 02:39:50>>334
見つかるまでさかのぼるupvarを書いてみました。
upvarが上位の変数名とローカル変数名を並べて書くのに対し、
上位の変数名だけ並べて書いて同じ名前でリンクするようにしてます。
proc upvar2 {args} {
set leveldepth [info level]
foreach varname $args {
for {set varlevel 2} {$varlevel <= $leveldepth} {incr varlevel} {
if {[uplevel $varlevel info exists $varname]} {
incr varlevel -1
uplevel 1 upvar $varlevel $varname $varname
break
}
}
}
}
0346デフォルトの名無しさん
2008/09/19(金) 21:57:20image photoって、-paletteで色数制限しても内部はフルカラーメモリ展開するのね。
やっぱ、WMで使うには富豪過ぎるか、Tclはorz
0347デフォルトの名無しさん
2008/10/16(木) 04:52:510348デフォルトの名無しさん
2008/10/27(月) 13:15:30どういう状況なのでしょうか?ご存知でしたら教えてください。
0349デフォルトの名無しさん
2008/10/27(月) 15:39:46スネーク。状況をもう一度よく確認するんだ。
Tcl → バージョンが上がらない
Firefox → バージョンあがりまくり
放っておかれたアドオン(plugin)はどうなる?
0350デフォルトの名無しさん
2008/10/28(火) 07:20:41了解
メインバージョンが上がらないと更新されない訳ですね。
0351デフォルトの名無しさん
2008/10/31(金) 16:09:38っかZETってソフトのちょい変だけど。
ttp://carnageez.web.fc2.com/catdir/cat.html
0352デフォルトの名無しさん
2008/10/31(金) 22:10:520353デフォルトの名無しさん
2008/11/01(土) 05:18:31名前空間って何?( ゚д゚)ポカーン
0354デフォルトの名無しさん
2008/11/01(土) 05:45:22http://www.tcl.tk/man/tcl8.3/TclCmd/namespace.htm
0355デフォルトの名無しさん
2008/11/01(土) 07:09:06ありがと。
へえーーなんちゃってオブジェクト化って感じなんだね。
0356デフォルトの名無しさん
2008/11/01(土) 09:51:35なんか入門的な情報ない?
0357デフォルトの名無しさん
2008/11/01(土) 16:24:05for e $lis { something $e }
とかやらずに、$lisに直接何かを作用して写像を得たり、
フィルタリングできるの?
0358デフォルトの名無しさん
2008/11/01(土) 22:49:17tclのproc関数の出力をtkのテキストに書き出すにはどのようにすれば
いいのでしょうか?
いまいちtclとtkの連携方法がわからず困っています。
0359デフォルトの名無しさん
2008/11/02(日) 02:01:41set str "hogehoge"
f_text_update $str
proc f_text_update {win str}
if {![winfo exists $win]} {
text $win
grid $win -column 0 -row 0
}
$win delete 0.0 end
$win insert end $str
}
0360デフォルトの名無しさん
2008/11/02(日) 02:12:55f_text_update [f_proc_func]
proc f_proc_func {} {
return "hogehoge"
}
これでどうだ
■ このスレッドは過去ログ倉庫に格納されています