11/05/08 02:01:45.23
少なくとも
fileID2 にも -translation binary が必要で、puts に -nonewline オプションが必要だともう。
740:736
11/05/08 02:06:42.32
>>739
ご指摘の通りにしたら正常に動作しました。
これがわかれば置換等の編集をして保存することも難しくないかもしれません。
頑張ってみます。
ありがとうございました。
741:733 735 739
11/05/08 02:15:08.51
どういたしまして。
Pythonが使えるのになぜTclなんだという疑問がありますが、Tcl使いが増えるとちょっとうれしい。
742:デフォルトの名無しさん
11/05/10 20:13:53.27
あるディレクトリ内にあるファイルのパス名のリストを得るにはどうしたら良いでしょうか?
同じ階層だけであればglobで簡単にできますが、
下層にあるディレクトリ内のファイルも全て対象にしたいのです。
743:デフォルトの名無しさん
11/05/10 21:29:56.14
globを再帰でつくる
とか、
Tcllibパッケージのfileutilを使う
package require fileutil
::fileutil::findByPattern . -glob *
744:デフォルトの名無しさん
11/05/12 00:00:56.94
Tcl/Tkによるバイナリエディタ
URLリンク(reddog.s35.xrea.com)
745:デフォルトの名無しさん
11/05/19 00:16:38.55
>>741
自分はこれからTcl/Tkを覚えようかとしてるんですが、この言語けっこう恵まれてません?
まぁ、自分のニーズもあるんですが、
・スクリプトで、GUIを手軽に書ける
・グラフの描画ライブラリがある(クリック可能)
・他言語との連携ができる
・単独で動作するバイナリができる
・言語仕様が簡単
・クロスプラットフォーム
・オープンソース
・枯れてる
この条件だとPythonでもよかったんですが、Pmw.Bltはちと不安で…。
自分でメンテ+拡張しようにも、結局内部でTkコマンド呼んでるだけだったんで、なら、ということで。
746:デフォルトの名無しさん
11/05/22 00:30:34.87
なぜかユーザーは少ない。最近はちょっと増えてきた気もするが
8.3~8.4のころは本当に見向きもされてなかった
747:デフォルトの名無しさん
11/05/22 23:15:17.27
PythonでTkinterを介してTkを利用するのって難しすぎじゃね?
Tcl/Tkに慣れすぎると、Tkinterが煩わしくて仕方ない。
どうしてもPythonを使わざるをえない場合は仕方ないけど
できるだけTcl/Tkでやりたくなる。
748:デフォルトの名無しさん
11/05/23 23:08:54.27
まあPython使うときはTk以外の選択肢いっぱいあるのでTk使わなくてもいいんでは
749:デフォルトの名無しさん
11/06/08 22:15:40.29
Tclってfork()できないのがつらい。
TclXはちょっと...
750:デフォルトの名無しさん
11/06/09 20:54:44.14
誰かWin/Linuxでドラッグ&ドロップができるようになる拡張、
8.5以降に対応しているので知らんかね…
とりあえずTkDND 2.2を試して見てるんだけど、8.5には対応
してないらしく、何ヶ所かバグを潰してXConvertSelectionまで
辿り着いたとこで、手詰まった。
※XConvertSelectionをLD_PRELOADでフックして、ちゃんと
Timeを与えるようにしたのにtimeoutになる、なぜだ…
751:デフォルトの名無しさん
11/06/11 15:06:12.77
TkDNDのfixかなり粘ったけど、これは無理。
Tk本体のselection getもtext/uri-listに対応してなかったり、かなり根が深そう。
これ修正するくらいだったら、一から実装したほうが多分早い。くそぅ。
752:デフォルトの名無しさん
11/06/12 13:33:18.93
誰か詳しい方、Tcl_CreateThreadについて教えてください…
拡張の処理に時間のかかる部分をThread化して、終了をvwait bgstatとかで
待とうとしてるんですけど、URLリンク(www.tcl.tk)のマニュアルには
「スレッドは親のinterpに触ってはいけない」とか書いてあるんで、スレッドから
set bgstatすることはできないようなのです。
このあたり、普通はどういう処理をするんでしょうか?
サンプルコードの場所なり、このソース読めば判るんじゃね、でも構わないんで、
なにかヒントをお願いします。
(vwaitのEXAMPLEにあるsocketコマンドは勘弁してください、挫折しました)
753:デフォルトの名無しさん
11/06/12 17:44:41.87
>>752
Tcl_CreateThread()ということは、Cで拡張を書いている?
だったら、Tcl_AsyncMark()が使えると思う。
Tclのthreadコマンドだったら、thread(n)に書いてあるように、thread::sendを
使えば、threadの結果をvwait出来ると思う。
754:デフォルトの名無しさん
11/06/12 18:28:11.50
>>753
Thanks!
CなのでTcl_AsyncMarkですが、マニュアルを読む限りそれっぽい!
とりあえず、何かサンプル書いて確かめてみます。
755:デフォルトの名無しさん
11/06/12 19:33:11.70
…あれ?
自分の理解では、これで合ってるはずなんですが…
スレ汚し失礼。
----------
#include <stdio.h>
#include <unistd.h>
#include <tcl.h>
static Tcl_AsyncHandler async_handle;
static int proc_finished(ClientData clientData, Tcl_Interp *interp, int code)
{
Tcl_SetVar2Ex(interp, "bg_stat", NULL, Tcl_NewIntObj(1), TCL_LEAVE_ERR_MSG);
printf("bg_stat has been set to 1.\n.");
return code;
}
Tcl_ThreadCreateType threaded_proc(ClientData clientData)
{
sleep(5);
Tcl_AsyncMark(async_handle);
}
static int asynctestHandleProc(ClientData data, Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
{
Tcl_ThreadId idPtr;
Tcl_CreateThread(&idPtr, threaded_proc, NULL, TCL_THREAD_STACK_DEFAULT, TCL_THREAD_JOINABLE);
return TCL_OK;
}
756:デフォルトの名無しさん
11/06/12 19:34:05.54
DLLEXPORT int Asynctest_Init(Tcl_Interp* interp)
{
async_handle = Tcl_AsyncCreate(proc_finished, NULL);
Tcl_CreateObjCommand(interp, "asynctest", asynctestHandleProc, NULL, NULL);
return Tcl_PkgProvide(interp, "asynctest", "0.0.1");
}
----------
#!/usr/bin/env tclsh
load [file join . libasynctest[info sharedlibextension]] asynctest
set bg_stat 0
set wait_stat 0
asynctest
puts "bg_stat is $bg_stat."
after 6000 {set wait_stat 1}
vwait wait_stat
puts "bg_stat is $bg_stat."
----------
$ ./asynctest.tcl
bg_stat is 1.
セグメンテーション違反です
757:デフォルトの名無しさん
11/06/12 20:18:25.01
Tcl_SetVar2Ex呼ぶとこでinterpがNULLになってる…
なんか勘違いしてるっぽいですね。
758:753
11/06/12 21:15:52.82
>>755
Tcl_AsyncMark(3)の
It is also possible for proc to be invoked when no interpreter is active.
そのものでは?
interp作る場合も注意が必要かな。tcllibとかにも注意。
親Threadにthread::sendでincr varとかを投げるほうが良いような気がしてきたけど。
759:デフォルトの名無しさん
11/06/12 21:53:20.76
>>758
ありがとうございます、仰る通りな気がします。
Tclのソースでも、
generic/tclAsync.c: Tcl_AsyncInvoke()
If invoked from Tcl_Eval just after completing a command, points to interpreter. Otherwise it is NULL.
generic/tclTest.c: AsyncHandlerProc()
this (interp==NULL) should not happen, but by definition of how async handlers are invoked, it's possible.
とか書いてありました。
ほぼUndocumentedで、これはない…
Tcl覚え始めてから、使う拡張ことごとく酷い目に合わされてるんで、
正直、使う拡張は最低限にしたく。
で、結局Tcl_AsyncCreateの第二引数にinterp渡して、無理矢理
proc_finishedで使えば、とりあえずは動くようです(Evilですが…)。
仕組み上ではこれで悪くないはず?なので、これで行こうと思います。
ほんとにありがとうございます。
760:758
11/06/13 00:33:27.18
>>759
どこで見たか思い出ないけど、Tcl_AsyncCreate()した時(=拡張のロード時)に
interpを保存しておいて、AsyncHandler()の引数がNULLの場合は保存したinterpを
使っていた。同じことをして動いた記憶はある。
引数がNULLということはコマンドを実行していないので、保存していたinterpを
使っても問題にはならないらしい。
逆に、複数のinterpが存在するとAsyncHandler()が呼ばれた時に渡されるinterpが
通知先である保証が無いのかな?
NULLでないのは何らかのコマンドが終了した瞬間だから、保存していたinterpを
使っても安全な気もするから、実行するコマンドが絶対に成功するようにすれば
それでいいんでは?
761:デフォルトの名無しさん
11/06/13 23:10:25.66
>>760
おぉ、詳細なご説明ありがとうございます。
ぼんやりとしていた理解が、明確になった気がします。
やっぱり同じ事を考えた方はいらっしゃるんですね。
というか、スレッドの終了をvwaitで待ちたいとか割とありえる状況な気がしますが、
ぐぐってもKodersでもまともにヒットしないってどういうこと…
この辺がニッチな言語の、もの悲しいとこですね。
762:デフォルトの名無しさん
11/06/16 00:12:12.28
ActiveTcl の8.4 から8.5に移行しようとしてるんだけど、8.5でなんかエクステンションが
すごく減ってない? 例えば8.4であったTclXMLが8.5には見当たらない。 インストールしたのは
ActiveTcl8.5.9.2.294317-linux-ix86-threaded.tar.gz. ドキュメントにはあるんだけど...
URLリンク(docs.activestate.com)
だいたい、8.4のtar玉は28Mあったのに8.5は20Mしかない
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
763:762
11/06/16 02:37:19.87
>>116-119
に解答がありました。 失礼しました。
764:天使 ◆uL5esZLBSE
11/07/05 02:14:58.01
↓↓
「「「「「「「「「 に解答がありました。 失礼しました。 」」」」」」」」」(爆ッゴミッッ!
765:デフォルトの名無しさん
11/07/06 17:28:55.22
↓
<<<<<<<<<<<<< 「「「「「「「「「 に解答がありました。 失礼しました。 」」」」」」」」」(爆ッゴミッッ! >>>>>>>>>>>>>(キリッ!!!きリッ!!!!
↑↑(きリキリッッ!キリ
土方が何をほざいて(笑)
天使#test_s
「天使の煽り」の提供でお送りしました
766:デフォルトの名無しさん
11/07/07 21:59:23.84
>>763
それは2007年当時の話。今のActiveTclでは
teacupで必要な拡張をダウソするのがナウ。
767:本田
11/07/11 23:50:09.19
[Tcl-announce] ActiveTcl 8.5.10.0 released
URLリンク(code.activestate.com)
768:本田
11/07/12 00:00:32.94
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
769:本田
11/07/12 21:01:46.78
Teacup
URLリンク(wiki.tcl.tk)
Teacup provides access to the Tcl Extension Archive.
It is the client to the TEApot server.
It is distributed with ActiveTcl by ActiveState.
770:デフォルトの名無しさん
11/07/26 13:53:55.22
canvasで書いた円と線の交差判定をしたいです。
計算しなくてもできるって聞いたんですがどうすればいいですか?
771:本田
11/07/30 06:39:19.48
円じゃなくて長方形領域ようだけど。
URLリンク(homepage3.nifty.com)
pathName addtag tag overlapping x1 y1 x2 y2
x1 y1 x2 y2 を座標とする長方形領域に少しでも重なるアイテムに対して tag で示されるタグを付けます。 x1 は x2 以下、y1 は y2 以下の数値でなければなりません。
772:本田
11/07/30 06:43:22.91
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
773:本田
11/07/30 06:52:55.54
×URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
774:デフォルトの名無しさん
11/08/03 22:02:33.46
Tclって複数行にわたるコメントってできるの?Cの/* ...
... */みたいな。
エディタに頼って全行頭をイゲタるしかないのか。
if 0 {
} ってのもなんだかなぁ...
775:デフォルトの名無しさん
11/08/03 22:39:32.06
どこのJava
776:デフォルトの名無しさん
11/08/05 22:47:02.97
>>774
できない。諦めろ。
777:デフォルトの名無しさん
11/08/05 22:48:49.89
proc rem comment {}
rem {
こめんととめんと
こめんとこめんとおおおお!!!
}
778:デフォルトの名無しさん
11/08/06 00:08:22.24
コメント途中に閉じ中カッコであぼーん
779:デフォルトの名無しさん
11/08/06 17:21:09.88
# コメント1\
コメント2\
コメント3#
でいけそうだけどどうかな?
# もコマンドみたいなものだから \ で続けて書けそうな気がする
最後の # は無くてもいいけど終端という意味で
780:デフォルトの名無しさん
11/08/06 21:28:04.24
それは毎行つけるので行頭#とあんまり大差ないな
781:デフォルトの名無しさん
11/08/07 08:03:02.17
Emacsで範囲指定して
M-x comment-region
782:デフォルトの名無しさん
11/08/09 19:15:00.11
C風。
proc /* {script} {}
proc */ {} {}
/* {
puts hello
puts hello
puts hello
}; */
HTML風。
proc <!-- {script} {}
proc --> {} {}
<!-- {
puts hello
puts hello
puts hello
}; -->
783:デフォルトの名無しさん
11/08/09 21:18:47.70
set comment {
コメント
}
>>782 と >>777 と同じく、中括弧がバランスしないと破綻する。
中括弧だけなら、
set comment "
コメント
"
という手もあるけど、" と カギ括弧[] を意識しないといけない
784:デフォルトの名無しさん
11/08/09 21:26:01.94
#コマンドの振る舞いって謎だな
{}は改行も含めて一つの要素にするはずだから、
# {あほ
ばか
}
で#コマンドは{あほ改行ばか改行}を一つの引数とするはずなのに、{あほ まででコメントが終了しちゃうよね。
set a {あほ
ばか
}
だとちゃんとaに{あほ改行ばか改行}が入るのに
785:デフォルトの名無しさん
11/08/09 22:50:35.79
#はTclにおいてもコマンドではない。が正解。
786:デフォルトの名無しさん
11/08/10 22:11:16.68
なるほど
#はコマンドの置ける位置に置かねばならないがコマンドではなく行末までのコメントとして処理されるということか
行末の\継続は生きてる状態で。
787:デフォルトの名無しさん
11/08/27 23:51:43.68
toplevel .w1
bind .w1 <Destroy> "puts destroyed"
button .w1.b1
button .w1.b2
pack .w1.b1 .w1.b2
ってやって、.w1を閉じると"destroyed"が3回出てくる。
子持ちウィジェットを閉じると、子供の分まで<Destroy>イベントが発生するらしい。
これって仕様なのかな。
788:デフォルトの名無しさん
11/08/28 21:06:23.24
>>787
仕様。
但し正確には、子供のぶんまでイベントが発生するのではなくて、子供が処理するイベントに
toplevelのぶんが含まれている。
"puts destroyed %W" とかするとわかると思う。
あとはbindtagsのman-page参照。
789:デフォルトの名無しさん
11/08/29 23:40:56.18
>> 787
やりたいこととあってるか分からないけど、toplevel限定なら
toplevel .w1
proc CLOSE_TOPLEVEL {w} {
puts $w
}
wm protocol .w1 WM_DELETE_WINDOW [list CLOSE_TOPLEVEL .w1]
とかはできる。
790:デフォルトの名無しさん
11/08/29 23:52:37.47
AssocQueryStringWというWindows APIが使いたかったので、
URLリンク(msdn.microsoft.com)(v=vs.85).aspx
package require Ffidl
ffidl::callout AssocQueryString {int int pointer-utf8 pointer-utf8 pointer-utf8 int} int [ffidl::symbol shlwapi.dll AssocQueryStringW]
としてみたんですが、
set ASSOCF_NOTRUNCATE 32
set ASSOCSTR_EXECUTABLE 2
set pszFile [string repeat \0 255]
set dwOut 0
AssocQueryString $ASSOCF_NOTRUNCATE $ASSOCSTR_EXECUTABLE {c:\sample.txt} "open" $pszFile $dwOut
=> -2147024809
というのが返ってきます。
たぶん、ERROR_INVALID_PARAMETER(0x80070057) のことだと思うんですが、どの辺が間違ってるんでしょうか?
791:デフォルトの名無しさん
11/08/31 00:16:00.83
>>788 >>789
ありが㌧
とりあえず
bind .w1 <Destroy> ...
のかわりに
bind .w1.b1 <Destroy> ...
にしたら(子供がいないので)一回だけ処理されるので
目的は達成できてますが、動作が疑問だったんで。
792:デフォルトの名無しさん
11/09/01 20:45:44.79
>>790
1 W系は文字列がUnicode(UTF-16)
2 dwOutが0だと書き込むメモリ領域も0扱い
package require Ffidl
ffidl::callout AssocQueryString \
{int int pointer-utf16 pointer-utf16 pointer-var int} int \
[ffidl::symbol shlwapi.dll AssocQueryStringW]
set ASSOCF_NOTRUNCATE 32
set ASSOCSTR_EXECUTABLE 2
set dwOut 1000
set pszFile [binary format x$dwOut]
set result [AssocQueryString \
$ASSOCF_NOTRUNCATE \
$ASSOCSTR_EXECUTABLE \
"c:\\sample.txt" \
"open" \
pszFile \
$dwOut]
puts result=$result
puts pszFile=[string trim [encoding convertfrom unicode $pszFile] \x00]
XPだと動くけど、64bit版Vistaだとクラッシュするのお・・・。
793:デフォルトの名無しさん
11/09/09 01:55:06.30
>>792
どうもありがとう。
32bit版Win7ではクラッシュ。型が違うのかなあ。。。
794:デフォルトの名無しさん
11/09/09 23:18:14.02
>>793
イベントログにはなんて出てる?ワシのは
エラー 2011/09/09 22:49:03 Application Error 1000 (100)
障害が発生しているアプリケーション tclsh85.exe、バージョン 8.5.2.2、タイム スタンプ 0x47f30c38、
障害が発生しているモジュール SHELL32.dll、バージョン 6.0.6002.18393、タイム スタンプ 0x4d39b5c7、
例外コード 0xc0000005、障害オフセット 0x00008f1a、 プロセス ID 0x17ec、
アプリケーションの開始時刻 0x01cc6ef73c41e270。
て。ひょっとしてshlwapiが壊れてる?
795:デフォルトの名無しさん
11/09/10 01:09:56.11
脳が障害を起こしました
796:デフォルトの名無しさん
11/09/12 00:35:13.36
>>794
なんかJITデバッガのせいでイベントログには残らないみたいですが、
デバッガには以下が表示されてました。
wish84.exe の 0x76d93d52 (shell32.dll) でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x000003e8 を読み込み中にアクセス違反が発生しました。
CAssocArray::GetStringという関数でエラーになってるらしいですが、何に使われてるのかは不明。
797:デフォルトの名無しさん
11/10/22 17:14:45.57
Tcl/tkって、伺かみたいなGUIは実現できるのでしょうか?
798:デフォルトの名無しさん
11/10/25 23:08:12.87
> 797
この辺があればできるのではないかと。
二次元キャラ -> Tk canvas + Imgでpngファイルが使える + TkTrans.dllで背景透過
サウンド -> snack
Windows API, COMの利用 -> TWAPIとFfidl, tcom
設定画面とかは普通にTkで。垢抜けた見た目を求めるならtile拡張
知識の泉
* ActiveTclに添付のヘルプ
* URLリンク(wiki.tcl.tk)
* URLリンク(www.tkdocs.com)
ActiveTclに標準添付じゃない拡張たち
TkTrans.dll
URLリンク(goo.gl)
TWAPI
URLリンク(twapi.magicsplat.com)
Ffidl
URLリンク(elf.org)
799:デフォルトの名無しさん
11/10/30 13:19:20.79
canvasで、ある位置の色を取得したいのですが可能でしょうか?
どうすれば取得できるでしょうか?
800:デフォルトの名無しさん
11/10/31 19:58:14.80
> 799
できたよ。
URLリンク(wp.me)
801:デフォルトの名無しさん
11/10/31 21:12:04.23
>>800
GDIですか、windows用ですね
参考にさせてもらいます
ありがとうございます!
802:デフォルトの名無しさん
11/11/11 22:55:33.88
ActiveTcl 8.5.10->8.5.11 ファイル容量少し小さくなった
803:デフォルトの名無しさん
11/11/18 23:57:56.40
envってグローバルだったんだね。
proc内でglobalつけないで使ってたら
ぜんぜん環境変数にアクセスできなくて、
半日はまった。orz
804:デフォルトの名無しさん
11/11/19 01:12:58.43
>>803
env使うってCGIでも作ってるの?
組み込み変数は全部グローバルだから、
一度info globalsのリストに目を通しておくとそういうときにピンとくると思う。
805:デフォルトの名無しさん
11/11/19 07:50:33.66
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
806:デフォルトの名無しさん
11/11/19 12:32:51.20
誰もが一度ははまるstr
807:デフォルトの名無しさん
11/11/27 12:50:30.83
ゲームでキャラを移動させるような場合、bindを用いてカーソルキーで操作すると
キーボードのオートリピート機能のせいで、動き始めた直後に一瞬動きが止まります。
スムーズに動くようにするにはどうしたら良いのでしょうか?
808:デフォルトの名無しさん
11/11/28 00:52:09.92
inp(0), inp(1)
809:デフォルトの名無しさん
11/11/29 00:48:45.31
>>807
簡単なテストコード見せて
810:デフォルトの名無しさん
11/11/29 18:09:48.11
>>809
wm geometry . 500x500
canvas .c -bg white
pack .c -expand 1 -fill both
.c create oval 230 230 270 270 -fill red
bind . <KeyPress-Up> {.c move 1 0 -3}
bind . <KeyPress-Down> {.c move 1 0 3}
bind . <KeyPress-Right> {.c move 1 3 0}
bind . <KeyPress-Left> {.c move 1 -3 0}
キー入力の判定だけC言語で書いて、
例えばWindowsならWindows APIを利用するようにすれば解決すると思います
でも、Tclだけで解決する方法はないのでしょうか?
811:デフォルトの名無しさん
11/11/29 22:33:47.99
ググってみたけどこんな方法しかないような
wm geometry . 500x500
canvas .c -bg white
pack .c -expand 1 -fill both
.c create oval 230 230 270 270 -fill red
set moveto ""
bind . <KeyPress-Up> {set moveto "up"}
bind . <KeyPress-Down> {set moveto "down"}
bind . <KeyPress-Right> {set moveto "right"}
bind . <KeyPress-Left> {set moveto "left"}
bind . <KeyRelease> {set moveto ""}
proc move {} {
global moveto
switch $moveto {
up { .c move 1 0 -3 }
down { .c move 1 0 3 }
right { .c move 1 3 0 }
left { .c move 1 -3 0 }
}
after 10 move
}
after 10 move
方向を一つの変数でまとめてるけど方向別にすれば斜め移動も出来る
812:デフォルトの名無しさん
11/11/30 00:27:19.26
>>810
どういうゲームかわからないけど、イベントループを自分で管理するべき。
そして、そのイベントループの中で、KeyPressで動かしはじめて、
KeyReleaseが来るまで動かし続ける。簡単には>>811みたいな。
ちゃんとしたゲームしたいならasteroids.tclが参考になると思う。→URLリンク(wiki.tcl.tk)
813:デフォルトの名無しさん
11/11/30 12:06:12.14
カーソルキーを押しっぱなしにすると
ずっとKeyPressのままってわけじゃない。
KeyPressとKeyReleaseが交互に発生する。
だからそれは全然アドバイスになってない。
814:デフォルトの名無しさん
11/12/01 10:45:21.56
wm geometry . 500x500
canvas .c -bg white
pack .c -expand 1 -fill both
.c create oval 230 230 270 270 -fill red
array set direction {
n 0
s 0
e 0
w 0
}
set delta 3
bind . <KeyPress-Up> {set direction(n) 1}
bind . <KeyPress-Down> {set direction(s) 1}
bind . <KeyPress-Right> {set direction(e) 1}
bind . <KeyPress-Left> {set direction(w) 1}
bind . <KeyRelease-Up> {set direction(n) 0}
bind . <KeyRelease-Down> {set direction(s) 0}
bind . <KeyRelease-Right> {set direction(e) 0}
bind . <KeyRelease-Left> {set direction(w) 0}
proc move {} {
global direction delta
if {$direction(n)} {.c move 1 0 -$delta}
if {$direction(s)} {.c move 1 0 +$delta}
if {$direction(e)} {.c move 1 +$delta 0}
if {$direction(w)} {.c move 1 -$delta 0}
after 10 move
}
move
815:デフォルトの名無しさん
11/12/01 13:31:06.09
>>813
普通はそうならない。
コントロールパッド本体に連射機能がついてるとかならあり得るかもしれないけど。
816:デフォルトの名無しさん
11/12/01 21:21:12.29
>>815
いや、Tkのキーバインドだとキーボードのキーリピートが働いてしまう。
メモ帳とかに文字を入力する時、たとえば"a"を押しっぱなしにすると、
"a"が一つ表示された後、少し間を置いてaが連続して入力されるだろ。
あれと同じことが起こる。
下のサンプルを動かしてごらん
set x ""
pack [label .t -textvariable x]
bind . <KeyPress-a> {append x 1; update}
bind . <KeyRelease-a> {append x 0; update}
817:816
11/12/01 21:35:31.25
このサンプルを動かして、aを押しっぱなしにしたら
1と0が交互に表示されるはず。
そうならなかったらよっぽど特殊なキーボードを使ってるんだろう。
818:デフォルトの名無しさん
11/12/02 11:26:05.96
連射機能付きJOYstickだろ
819:デフォルトの名無しさん
11/12/02 15:07:54.99
>>816,817
そのコード片を試したわけでないので何だが、
通常、キーを押しっぱなしにすると
KeyPress/KeyDownは複数飛んでくるが
KeyReleaseは離したときに1回飛んでくるだけじゃないのかね。
820:デフォルトの名無しさん
11/12/02 19:29:43.54
試さないで何言ってる
821:デフォルトの名無しさん
11/12/02 21:14:48.05
>>819
なぜテストしなかったの?
コードを走らせてみれば一目瞭然なのに。
少なくとも俺の環境では>>816-817の言う通りになったけど。
で、>>811や>>814のようにループで処理するとなめらかに動くのは
なぜか適度にKeyReleaseが無視されているからだとわかった。
それを確認するには下の2つのコードを動かしてみればいい。
ループがあるとほとんどグリーンの円のみが現れるが、
ループが無いとグリーンとレッドの円が交互に現れる。
# ループを通した例
wm geometry . 500x500
canvas .c -bg white
pack .c -expand 1 -fill both
bind . <KeyPress-a> {.c create oval 0 245 10 255 -fill green -tags en}
bind . <KeyRelease-a> {.c create oval 0 245 10 255 -fill red -tags en}
proc main {} {
.c move en 3 0
update
after 10 main
}
main
#ループ無し
wm geometry . 500x500
canvas .c -bg white
pack .c -expand 1 -fill both
bind . <KeyPress-a> {.c create oval 0 245 10 255 -fill green -tags en; .c move en 3 0; puts 0}
bind . <KeyRelease-a> {.c create oval 0 245 10 255 -fill red -tags en;.c move en 3 0; puts 1}
822:デフォルトの名無しさん
11/12/02 23:24:20.45
>>821
ループ無し
URLリンク(i.imgur.com)
823:デフォルトの名無しさん
11/12/02 23:50:43.04
ループ無し
URLリンク(ozcircle.net)
俺の環境ではこの通り
824:デフォルトの名無しさん
11/12/03 10:24:08.91
だから~環境依存の問題の臭いがしてるのに、
バージョンもOSも書かずに「俺の環境」じゃ
誰もこれ以上何もできんだろ
825:デフォルトの名無しさん
11/12/03 11:50:49.20
>>824
Windows7とWindowsXPとLinux Mint 11で確認済
というか、そうならない環境が例外だと思われる
826:825
11/12/03 11:54:22.55
Tclのバージョンは8.4と8.5で試したが、結果は同じ
827:本田
11/12/04 21:44:12.75
>>825
もし同じPCでテストしてるなら。
BIOSが同じだから結果が同じ可能性がある。
828:デフォルトの名無しさん
11/12/04 21:57:17.27
>>827
俺も試してみたけど>>823みたいになった。
3台のPCでテストしたんだけど変わらない。
ってことは環境依存だとしても、そういうのって結構多いんじゃない?
829:本田
11/12/04 23:25:19.71
キーのリピート速度と遅延時間を設定するには
URLリンク(www.atmarkit.co.jp)
同じキーを押し続けると、そのキーが連続で入力できる。
連続で入力される速度を「リピート速度」、キーを押してからリピートを開始するまでの時間を「遅延時間」と呼ぶ。
キーのリピート速度と遅延時間は、kbdrateコマンドで変更できる。
オプションを何も指定しないでkbdrateコマンドを実行すると、リピート速度が10.9cps(1秒当たり10.9文字)に、遅延時間が250ミリ秒(ms)に設定される。
これが、Linuxのデフォルトの数値だ。
使用可能なオプションは、-s、-r、-dだ。
830:本田
11/12/04 23:52:04.88
キー・リピート (key repeat)
URLリンク(www.atmarkit.co.jp)
キーを押したままにしたときに、連続的にそのキーが繰り返し入力されたように扱うしくみ。
一般的には、キーが押し下げられてから、キー・リピート処理が開始されるまでの間隔と、
リピート間隔(連続的にキー入力を発生させる際の時間間隔)を設定できる。
831:デフォルトの名無しさん
11/12/05 23:44:17.05
>>814>>815のものですが、>>810を見て、てっきりWindowsの話と思ってました。
これが答えになるんじゃないでしょうか。
X Window SystemではオートリピートでPress/Releaseが交互に発生するらしいです。
URLリンク(goo.gl)
Windowsでなるという人いないはずだよね?
832:デフォルトの名無しさん
11/12/05 23:57:02.19
あと、確認の仕方は以下で十分です。
bind . <KeyPress> {puts KeyPress}
bind . <KeyRelease> {puts KeyRelease}
console show
833:デフォルトの名無しさん
11/12/06 10:23:09.00
WindowsのオートリピートってX Windowと挙動が違うの?
オートリピートなんてみんな同じだと思ってた
834:デフォルトの名無しさん
11/12/06 21:17:09.62
X Windowって言うな
835:デフォルトの名無しさん
11/12/06 21:57:13.95
>>834
いみふ
836:デフォルトの名無しさん
11/12/06 22:04:04.24
X Windowsというと嫌がる人ってのは見たことあるけどな
X Windowだったら単純にSystemを省略しただけだから何が悪いのかわけわからん
837:デフォルトの名無しさん
11/12/07 00:27:18.67
>>835, >>836
同感。
838:デフォルトの名無しさん
11/12/07 07:30:17.47
ま、開発元は嫌がってるけどね。
839:デフォルトの名無しさん
11/12/07 15:53:36.77
略すなら X のみだろ常考
840:デフォルトの名無しさん
11/12/07 17:55:46.65
X Windowsでいいよ
呼び方なんぞどうでもいい
841:デフォルトの名無しさん
11/12/07 19:52:34.30
tclvfsってどんなもので、どう使えばいいんでしょうか?
意外と情報が少ないし、たまたま見つけたサンプルコードのほとんどがまともに動かないんですけど。
842:デフォルトの名無しさん
11/12/07 20:00:14.15
SX-Windowでいい。
国産だし。
843:デフォルトの名無しさん
11/12/07 20:06:01.06
zipとかjarみたいなもんだと勝手に想像 freewrapみたいなものを自前で実装とか
844:デフォルトの名無しさん
11/12/08 11:07:43.09
>>841
Starkit/Starpack, TclApp, freewrapはtclvfsを使って単一ファイル内にディレクトリ階層を持った複数のファイルを格納してる。
例えばTkSQLiteというフリーソフトがあるけど、あのEXE配布バージョンはStarpackで作られてるので(たぶん)、
package require vfs::mk4
vfs::mk4::Mount tksqlite.exe t
glob -directory t *
vfs::unmount t
とかやると中身が見れる。
ここでtは仮想的なディレクトリの名前になってるので、
set ch [open t/tksqlite.tcl]
puts [read $ch]
close $ch
とかやればファイルが読めるし、
file copy hoge.tcl t/hoge.tcl
とかやればファイルを追加できる。
自分でVFSを作ることもできる。
vfs::mk4::Mount new.vfs t
file mkdir t/subdir
set ch [open t/subdir/hoge.txt w]
close $ch
vfs::unmount t
他にもftpディレクトリをローカルファイルシステムのように扱うvfs::ftpとかいろいろあるみたいだけど使ったことはない。
845:本田
11/12/08 23:16:45.72
>>841
Practical Programming in Tcl and Tk, 4th ed
URLリンク(beedub.com)
URLリンク(beedub.com)
URLリンク(beedub.com)
846:デフォルトの名無しさん
11/12/10 07:15:51.33
tclで'A'という文字からアスキーコード65を得るには、どうやればいいでしょうか?
847:デフォルトの名無しさん
11/12/10 12:04:09.29
>>846
binary scan "A" c val
puts $val
848:デフォルトの名無しさん
11/12/10 13:17:19.43
>>847
ありがとうございます
849:本田
11/12/17 12:06:21.27
Graphics with TCL/TK
URLリンク(www.youtube.com)
850:デフォルトの名無しさん
11/12/24 12:21:45.17
toplevelで作ったウィンドウを手で動かしてから、
wm withdrawで非表示にし、wm deiconifyで再表示させると、
最初に作られた位置に出現します。
(厳密に言うとそれよりちょっと右下)
Tkの仕様なのかウィンドウマネージャの仕様なのか、
消えた時の位置に再表示されるのが自然だと思うんですが。
それともやり方が間違ってるんだろうか?
環境:
Tk 8.4
Soralis 10
CDE 1.6.3
851:デフォルトの名無しさん
12/01/03 19:11:53.53
>>5
さすがだねw
852:デフォルトの名無しさん
12/01/22 19:54:12.53
書けない?
853:デフォルトの名無しさん
12/01/22 19:54:41.21
あれ、書けた。あけおめ。
854:デフォルトの名無しさん
12/02/01 22:24:24.34 BE:30017423-2BP(1250)
ネタがなにも無くて暇だ
855:デフォルトの名無しさん
12/02/01 23:51:44.54
850には答えてやんないの?
856:デフォルトの名無しさん
12/02/02 00:46:23.97
>>855
だってTk8.4もう使ってないし、CDEも使ったこと無いし、
Sorarisの環境も無いし、ウィンドウマネージャーのせいな気がするから、
環境が無いと確認のしようがないし、
857:デフォルトの名無しさん
12/02/04 13:14:29.62
850です。
ですよねぇ~。
仕事のマシンで環境いじれないし、
Tcl/Tkなんて(自分以外)ほとんど使ってないからなぁー。
858:デフォルトの名無しさん
12/02/13 21:11:55.61
Tclは実行前にバイトコードにコンパイルされ、高速化が図られていると、説明されています。
することにもよると思いますが、bash,perl,ruby,pythonと比べると速さはどうなんでしょう?
プログラムミング未経験者の、素朴な疑問です。
859:デフォルトの名無しさん
12/02/22 11:52:16.55
>850
Windowsでは消えた場所に戻るからウィンドウマネージャの仕様だと思う。
無理やり戻すしかない。
namespace eval GeometryMemory {
variable geometry
array set geometry {}
}
proc GeometryMemory::install {t} {
bind $t <Unmap> {GeometryMemory::save %W}
bind $t <Map> {GeometryMemory::recover %W}
}
proc GeometryMemory::save {t} {
variable geometry
set geometry($t) [wm geometry $t]
}
proc GeometryMemory::recover {t} {
variable geometry
if {[info exists geometry($t)]} {
wm geometry $t $geometry($t)
array unset geometry $t
}
}
860:デフォルトの名無しさん
12/02/22 11:53:14.60
テストスクリプト
proc GeometryMemory::test {t} {
toplevel $t
GeometryMemory::install $t
update
puts "0: [wm geometry $t]"
wm withdraw $t
update
puts "1: [wm geometry $t]"
wm geometry $t +0+0
update
puts "2: [wm geometry $t]"
wm deiconify $t
update
puts "3: [wm geometry $t]"
}
GeometryMemory::test .t
console show
861:デフォルトの名無しさん
12/02/22 15:59:53.47
>>858
Tclは最近のベンチマークサイトからは仲間外れにされてることが多いのでなかなか比較が見つからないけど、
比較的新しいサイトを見つけました。
URLリンク(goo.gl)
ちょっと信じがたい感じもしますが、ここによると
Perl5 >> PHP > Ruby = Python2 >> Python3 >> Tcl
みたいな感じですね。Tcl 8.4.19ですけど、8.5では劇的な速度向上はなかったと思うので、
大して変わらんのに対し、Rubyは1.9でかなり速くなったらしいので、
最新版で比べるとさらに分が悪い感じがします。
bashは、、、汎用言語といえるのかなあ。
862:デフォルトの名無しさん
12/02/22 21:44:55.73
>>861
レスもらえてうれしいです。そのうえ的確なサイト紹介です。
速さとか実行速度で検索していたのですが、ベンチマークという言葉が思い当たらず、適当なサイトが見つかりませんでした。
このサイトを見て驚いたのは、Perlの速さとJava・Luaの遅さですね。また、C++は最速と思っていました。
やはり、プログラムの内容でしょうか?
>Test code grows text string by adding another string in cycle until it grows up to 4 mb.
恥ずかしながら英語も全然ですのでよく分かりませんが、このベンチマークは文字列操作に該当するのでしょうか?
LL言語は文字列操作が得意と説明されていますよね。
bashも入れたのは、私が試したいのが次のような内容で、キーボードでの打鍵数を調べたいのです。
1 英文字で100万字の普通の文書を、#,=等の記号も含めてアルファベット順に何文字あるのかカウントする。
2 少し複雑で、日本語で100万文字をローマ字入力したと解釈させカウントする。
2のケースは条件があります。
a 小さな'つ'の扱いです。リナックスはrinukkusuとkが2つ、アップルはappuruとpが2つとします。
b んの扱い。例えば安心は、ansinnと'ん'のあとがナ行以外なら1文字ですみますが、それ以外の'ん'は2文字必要です。
c 最後にちゃ、ちゅ、ちょはcha,chu,choと、しゃ、しゅ、しょはsha,shu,shoとすることです。
863:862
12/02/22 21:45:49.12
カウントする方法がプログラムと言えるのか、shellとかawkでも可能かどうかさえ分かりません。
このスレに書き込んだのは、今からtcl/tkの勉強を始めようと思い、実際のところを知りたかったからです。
tclshがあってインタラクティブに使え、tkでGUIも簡単に扱える、そのうえクロスプラットフォームという魅力から、
tclが多言語に比べて遅くてもよかったのです。BSDで作ったフレームがWindowsで開くまではしました。
eltclshというものを見つけました。簡単なパスとコマンドの補完ができます。
tclshではプロンプトにpwdをだせますが(改行して2行表示はできない)、eltclshではプロンプトの修正が今の私にはできません。
eltclshを改良して意地でもログインシェルにしたいと思っています。
なぜ、tclshはログインシェルになりえなかったのでしょう。
長文ついでに>>861さんにもう一度感謝をのべよう。
tclの復権を願って、これで書き逃げさせていただきます。
864:デフォルトの名無しさん
12/02/24 00:13:15.78
>>859
さんくすです。
おっしゃるとおり結局は,消す前に位置を保存して,
再表示した後で位置をもどすということで解決はしましたが,
なんかすっきりしなかったんですよね。
865:デフォルトの名無しさん
12/02/24 19:38:26.78
>>862
ベンチマークの内容は"abcd____________"という文字列がひたすらつながった4MB+alphaの文字列が1つの変数に格納されるというものです。
なんかベンチマーク用にあえて死ぬほど非効率な方法で実装されていますが、同じ結果を得たいだけなら100ms以下でできる方法があるので
もうちょっと妥当なスクリプトだったらと思います。まあ、それでも負けてるのでしょうが。。。
862さんが作ろうとしているものはKAKASIという漢字->ローマ字変換プログラムを使って、いったんすべてASCIIにしてから処理するのがいいと思います。
URLリンク(goo.gl)
その上で、bashよりもTclを使うメリットは、連想配列があることです。
ただ、連想配列を持つ言語はほかにいくらでもあるので、PerlでもRubyでも好きな言語を使えばいいと思います。
またbashではできないということでもないです。
bashやzshが気に入られてるのは補完機能などが充実してるからではないですかね。
866:デフォルトの名無しさん
12/02/24 20:51:13.77
スクローラブルなウィンドウ(キャンバスウィンドウとか)内のアイテムを<B1-Motion>でドラッグ
するときに、ウィンドウの端あたりまでドラッグしていくとその先の方向へスクロールしてくれる
ようなのを実装したいんですが、参考になるコードスニペットないでしょうか?
867:デフォルトの名無しさん
12/02/25 00:04:22.73
>>865さん
全米が泣いた。
リナックスの世界へ案内しよう
kakasi -Ha -Ja -Ka < test.txt
rinakkusunosekaiheannaishiyou
いろいろ試したのですが、案内のnが一つ少ないほかは完璧でした。
デフォルトがヘボン式なので、意図どおりです。感謝申し上げます。
打鍵数調べに速さは関係ありませんが、tclは8.4から最新バージョンだと、
20%くらい速くなっていそうですね。
URLリンク(news.mynavi.jp)
868:デフォルトの名無しさん
12/02/28 15:49:05.74
>>867
パフォーマンスに関しては、一概には言えないんですよね。
URLリンク(wiki.tcl.tk)
URLリンク(wiki.tcl.tk)
総合成績では8.4が一番優秀だったりします。
私も速度は必要なくて、乗り換えの動機はライブラリが
8.4をサポートしなくなり始めてるということぐらいなんですが。
869:デフォルトの名無しさん
12/02/28 21:11:00.69
lassign命だから8.4は愛せない
870:デフォルトの名無しさん
12/02/28 22:45:08.87
8.5最強伝説
- dictで連想配列の値渡最強
- dictはarrayより最速
- 無間桁計算で国家予算もらくらく計算
- clock addで日付計算最強
- clock formatで和暦がでるんだぜ!
- in 演算子がめちゃ楽最高
- switch正規表現比較が無敵
- lindex $list end-1とか書けちゃう柔軟さ
- {*}って知ってる?eval(失笑)ww
8.6最凶伝説(審議中)
- バイトコードエンジン再実装!速いのか!?
- try {} catch {} finally {} やっと使える!やっとか!
- coroutine って何に使うんですかあ?
- ooって結局どうなの。incr tcl ngの方がいいんじゃ・・・
-
871:デフォルトの名無しさん
12/02/29 16:09:13.53
>>861
試験したTCLのソースをみると単純な文字列置換に"regsub"函数を使っている
、ここを定石とおりに"string match"函数に置き換えると何百倍も速くなった。
(我輩の旧式機械で源リストを実行するとトンでもないことになるが、置き換えるとまともになる。)
tclは8版から劇的に速くなったが、正規表現まわりは遅いまま。
その事情を知って意図的に弱点を突いてきたようだ。
872:861
12/02/29 17:54:06.76
>>871
テストの趣旨を無視したバージョン
time {
set str "abcdefghefghefgh"
regsub -all {efgh} $str ____ str
set imax [expr {1024/[string length $str]*1024*4}]
set gstr [string repeat $str [expr {$imax+1000}]]
}
#=>4334 microseconds per iteration
少しは尊重する姿勢を見せてるバージョン
time {
set str "abcdefghefghefgh"
set imax [expr {1024/[string length $str]*1024*4}]
set gstr [string repeat $str [expr {$imax+1000}]]
regsub -all {efgh} $gstr ____ gstr
}
#=>114467 microseconds per iteration
5ms以下で終わる内容をあえてCore i5で10分以上かける方法でやるなんて
ばかばかしいよね。
873:871
12/02/29 23:28:59.71
tcl関係者はtcl 7.4->tcl8.1 で「劇速した」と云ったが
ユーザーは「yes except正規表現」と云っていた。
マニュアルも気合が入っていない項目と馬鹿丁寧な項目が入り混じっているし。
良くも悪くも、ちぐはぐが多いみたいだ。好き嫌いは激しかろう。
874:本田
12/03/04 23:41:21.56
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
875:本田
12/03/04 23:44:36.35
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
876:本田
12/03/04 23:47:21.25
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
877:デフォルトの名無しさん
12/03/07 20:28:21.05
TclでCのstatic宣言みたいなのができるとありがたいです。
いい方法はないでしょうか?
たとえば,プロシージャの中で,呼ばれた回数に依存した処理をするような場合,
下のように,global変数をインクリメントしたりしてますが,
他のglobal変数とぶつかったりしないか心配で,夜も眠れません。
namespaceだと大げさになりそうで。
proc foo {} {
global bar
if [info exists bar] {
incr bar
} else {
set bar 1
}
# 呼ばれた回数に依存する処理
}
878:デフォルトの名無しさん
12/03/07 22:30:41.71
>>877
URLリンク(wiki.tcl.tk) の下から二番目のスニペットとか。
879:本田
12/03/07 23:08:53.76
>>877
singleton application
URLリンク(wiki.tcl.tk)
880:デフォルトの名無しさん
12/03/09 20:33:11.94
>>878
>>879
おふた方ともありがとうございます。
やっぱりそんな簡単にはいかないですね。
それにしても反応早すぎw
881:デフォルトの名無しさん
12/03/10 11:07:27.49
間違えた。
速すぎ。
882:デフォルトの名無しさん
12/03/14 18:44:21.69
>>877
namespace大げさではけど、使いづらいとは思う。
もともと[incr Tcl]を取り込んだという割には、
名前空間付きの変数を作るitcl::scopeに相当するコマンドがなかったり、
プロシージャは見えるのに変数はvariableなしでは見れなかったりというのが使いづらい。
883:882
12/03/14 18:45:23.25
x 大げさではけど
o 大げさではないけど
884:デフォルトの名無しさん
12/04/16 17:32:28.78
tk_getOpenFile でショートカット指すとホンモノの名前が返ってきて読むとき便利だけど、ショートカット入ってたディレクトリーがどこだかわからない。どうすりゃ判るの?
885:デフォルトの名無しさん
12/04/17 11:23:18.41
tk_getOpenFileはショートカット(.lnk)ファイルそのものを返すことはできない。
Tkの組み込みコマンドなのでスクリプトで改造もできない。
OSネイティブのきれいなダイアログじゃなくてよければ可能。
::tk::dialog::file:: open
tk_getOpenFileコマンドがないときに使われる古いダイアログみたい。
詳しくは以下参照。
$::tk_library/tk.tcl
$::tk_library/tkfbox.tcl
886:デフォルトの名無しさん
12/04/17 11:28:02.15
>>884
URLリンク(wiki.tcl.tk)
887:デフォルトの名無しさん
12/04/17 21:42:15.41
>>885
>>886
884です。貴重なコメントありがとうございます。
いずれにしてもかなり敷居が高そうですね。
取り敢えずは回避策を軸に考えます。
888:デフォルトの名無しさん
12/04/26 15:47:16.82
>>887
全然敷居高くないよ。単に見た目が違うのを我慢してと言ってるだけ。
::tk::dialog::file:: open
というコマンドは、tk_getOpenFileと同じオプションを指定できるから
オプションは同じでコマンドだけ置き換えればおk
889:デフォルトの名無しさん
12/05/01 21:23:39.21
URLリンク(jim.tcl.tk)
Tcl8.6 のサブセットの Jim Tcl、本体は 8 ビットクリーンなのですが、内蔵ラインエディタが悪さしてシェル上での日本語入力を通しません。
それで、以下のようにしてその内蔵ラインエディタを外せばシェル上でも日本語を受け付けるようになります (CP932 でエスケープ文字と 2
バイト目が重なるようなものも、波かっこで挟んでエスケープ処理を抑制すれば入れられます)。
./configure --utf8 --disable-lineedit
utf8 のフォーマットに合う場合だけ utf8 として処理し、それ以外は単に 1 文字 8 ビットの文字列として処理します。Tcl8.6 の CVS 版に先
駆け、1 文字が 5 バイト長の utf8 文字列も取り扱えます。
なお、configure の処理実体が Tcl コードのため、そのままでのコンパイルには別の Tcl が必要です。
URLリンク(www.hecl.org)
Tcl 似の超コンパクトな言語 Hecl の方も、内蔵のラインエディタ jLine が日本語入力の邪魔をしているようですが、こちらは完全に組み込
まれているので、ソース自体の書き換えが必要になります (この理由で、jLine を外せば問題が解決するかどうかまでは試していません)。
890:デフォルトの名無しさん
12/05/02 23:32:02.54
configureがtclだと、、、?マジカヨ、、
891:デフォルトの名無しさん
12/05/04 10:40:49.18
>>888
884です。ご教唆ありがとう。これで読むとショートカットは尻に".lnk"が付いているので区別できるようですね。
次はショートカット・ファイルからリンク先を取り出す方法に格闘します。
892:デフォルトの名無しさん
12/05/05 00:53:02.81
>>891
ずいぶん難しいことしてるね。
Windowsのショートカットファイルはバイナリフォーマットだから自力で解析するよりtwapiを使うのがよいと思うよ。
URLリンク(goo.gl)
893:デフォルトの名無しさん
12/05/06 16:30:46.62
>>892
884です。何から何まで ありがとうございます。
尻が".lnk"のファイルは twapi::read_shortcut でホンモノの名前を白状させることができました。
お蔭様で、見掛けはしょぼく 中身が立派なスクリプトができました。
894:デフォルトの名無しさん
12/05/12 09:00:26.16
ここ読んでる人たちはEDA関連の人たちが多いんだろうなー
895:デフォルトの名無しさん
12/05/18 22:51:20.91
64bit用のtcl8.5のtcom.dllどこかにないでしょうか
tcl8.6 64bit用のtcom.dllは見つけたのですが・・・
↓
URLリンク(www.tin-pot.coco.mydisk.se)
tcomはソースがあるから何とかなりそうだけど、コンパイルやったことない。。。
twapiが代わりになるけど、こっちはExcelとかのオブジェクトを自動でに開放してくれない(´・ω・`)
どなたか手段わかりませんでしょうか
896:デフォルトの名無しさん
12/05/19 00:05:40.60
おれもWindows7 64ビットにしたとき、
Tclも64ビットライブラリで作り直したかったけど、
依存する奴全部揃えられなくて諦めた。
まあ64ビットにしないといけないアプリじゃなかったし。
で、tcomみたいなOFFICEアプリ?とかを操作するのに
64ビットじゃないといけないの?答えになってないが。
897:デフォルトの名無しさん
12/05/19 01:56:01.60
>>896
まあ、office操作自体は確かに64bitにする必要がないんです
とあるソフトに32bit版と64bit版があって、
これにそれぞれ32bitと64bitのtclが組み込まれていているんですが、
自分が32bitで動くスクリプトを作った後に、
それをそのまま64bitに持っていったらdllの問題で組み込めなかった・・・
悔しい。
という話です。。
64bitのPCに32bitのそのソフトをインストールすれば動作自体はするのですが。
898:デフォルトの名無しさん
12/05/25 16:17:21.15
>>861 のベンチマークはちょっと変えるとTclが圧倒的に速くなるよ。
[Ruby1.9.3]
+ str=str.gsub(/efgh/, "____")
gstr+=str;
- gstr=gstr.gsub(/efgh/, "____")
exec.tm.sec str.length
2sec 256kb
略)
395sec 3840kb
455sec 4096kb
[Tcl8.5.11]
+ regsub -all {efgh} $str ____ str
append gstr $str;
- regsub -all {efgh} $gstr ____ gstr
exec.tm.sec str.length
0sec 256kb
略)
0sec 3840kb
0sec 4096kb
899:デフォルトの名無しさん
12/06/17 21:24:30.09
ジオメトリーマネージャ(pack, grid, place)の働きが
イマイチよくわかりません。通り一遍のことはぐぐれば
わかりますが、ちょっと凝ったことをしようとすると
どれを選んでどういったオプションを指定すればよいか
いつも迷ってしまいます。
何かこうスッキリわかりやすく解説してくれてるとこって
ないですかね。書物は、この手のものはたいてい
高額なのでちょっと手が出ないかな。。。
900:デフォルトの名無しさん
12/06/18 07:52:40.33
>>899
僕も最初はあいまいなまま結果オーライで使ってたけど、Ruby/Tkの本が丁寧な解説で役立ったよ。
Rubyを256倍使うための本・界道編
URLリンク(goo.gl)
901:デフォルトの名無しさん
12/06/18 09:01:28.10
┌─┐
│●│
└─┤
_ ∩
( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘
902:デフォルトの名無しさん
12/06/18 22:46:47.84
>>900
256倍シリーズってまだあったんですね。
確かにあれはわかりやすいかも。
Rubyは盲点でした。
903:デフォルトの名無しさん
12/06/19 06:41:21.59
grid最強
pack, placeは後方互換用と思ってよい
…とtkdocsのサイトには書いてあった
URLリンク(www.tkdocs.com)
904:デフォルトの名無しさん
12/06/19 19:32:26.30
>>903
packはともかくplaceは置き換えられない部分があると思うなあ。
右上とか右下にくっついて動くロゴみたいなのはgridだとかえって難しい気がする。
gridのコマ割り考えるのも結構面倒。
905:デフォルトの名無しさん
12/06/19 22:00:48.41
pack,place,gridだけで配置するより、ある程度区切ったらframeを乗せて
その中で個別にpack,place,grid使って配置した方が楽
906:デフォルトの名無しさん
12/06/19 22:03:34.92
placeはゲームのようなドット単位で指定したりするときに便利。
俺はTkでそういうのを作る機会がなかったので使ったことがないけど。
gridが全てにおいて万能というわけでもない。
907:デフォルトの名無しさん
12/06/20 14:33:31.82
place使ってプログレスバーを作ってる例ならあるよ。Ruby/Tkだけど。
URLリンク(www.dumbo.ai.kyutech.ac.jp)
908:デフォルトの名無しさん
12/06/22 20:34:56.08
tclでテキスト処理して結果をxterm -e w3mで出力させたいのですが、以下のようにしても動きません。
どのようなやり方で出力させればよいでしょうか?
% tclsh
% set a "
test
test
"
% exec xterm -e "echo $a | w3m "
909:デフォルトの名無しさん
12/06/30 01:51:50.71
>>908
意図がよくわからないんだけど、aの中身はホントはHTMLにして
ターミナルにw3mでレイアウト表示したいってことなら、
set ch [open |[list w3m -T text/html << $a] r]
puts [read $ch]; close $ch
一応w3mが整形したとおりに出力される。
910:デフォルトの名無しさん
12/06/30 01:59:12.62
あ、xtermってあれか、Xのターミナルエミュレータか。
じゃあ、ちょっと違うかな。
リダイレクトのバリエーションでTclのチャネルを別プロセスに渡す方法とかあるみたいだから見てみたらいいかもしれない。
URLリンク(www.tcl.tk)
911:デフォルトの名無しさん
12/07/01 08:06:09.94
>>909,910
909を見てて下を試しましたら、出力することができました。
% exec xterm -e "w3m << a
$a
"
ありがとうございました。
912:デフォルトの名無しさん
12/07/28 08:05:27.41
Tcl/Tk 8.5.12 Release Announcement
July 27, 2012
913:デフォルトの名無しさん
12/08/02 19:12:11.95
ActiveTcl 8.5.12.0
URLリンク(www.activestate.com)
914:本田
12/08/02 23:54:45.63
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
URLリンク(downloads.activestate.com)
915:デフォルトの名無しさん
12/09/12 07:36:14.95
PTさん、8.5.12のtclkit作ってくれないのかなぁ
916:デフォルトの名無しさん
12/09/27 00:17:38.23
pack [frame .f -background ""] -fill both -expand 1
ってやると,色々配置したウィンドウを見た目変えずに一気に無効にできる。
destroy .f
で有効化。
だから何っていわれてもアレだけど。
917:デフォルトの名無しさん
12/10/05 20:50:57.35
>>915 こんなんありますけど
URLリンク(www.cqi.com.tw)
918:デフォルトの名無しさん
12/10/05 22:25:49.47
>>916
確かにマニュアルにもframeの-bg ""の挙動は書いてあるけど、Windows7+Tk 8.5.11だとバグってるっぽい。
なぜか一旦destroyしてもう一回 frame作るとそれっぽい動きにはなる。最大化するとやっぱりいろいろおかしい。
Linuxだと問題ないのかな。
button .b1 -text hoge
button .b2 -text hoge
place .b1 -x 10 -y 10
place .b2 -x 50 -y 50
pack [frame .f -background ""] -fill both -expand 1
919:デフォルトの名無しさん
12/11/20 00:18:52.14
保守?
920:デフォルトの名無しさん
12/11/26 18:33:59.94
Latest Release: Tcl/Tk 8.5.13 (Nov 12, 2012)
921:デフォルトの名無しさん
12/12/08 02:46:12.21
今、html5がやろうとしてることって、もともとtcl/tkがやろうとしてたことだよね
何で政治的に負けちゃったんだろう
922:デフォルトの名無しさん
12/12/15 17:34:24.88
expectもTCLだからここで聞いていいよね
expectというかtclで、設定ファイルを読みたい
bashのように、設定ファイルと見せかけて実は実行 でもいい
ロードかインクルードの方法ってありますか?
923:デフォルトの名無しさん
12/12/15 20:09:19.04
>>922
sourceじゃダメなのか?
>>920
ActiveTcl来た
PTさんのtclkitも来た
924:デフォルトの名無しさん
12/12/17 13:28:41.57
そろそろ8.6がリリースされるんじゃないかと思って
今年4月にPro Studioのサブスクリプションを自腹で1年延長してみたものの、
8.6に対応するときはメジャーアップデートでアップグレード対象外になる可能性に今頃気付いた。
そんなもったいないことしてる人は他にいないと思うが。。。
でもいいの。ActiveTclだけでもリリースし続けてくれてるだけで満足でございます。
925:デフォルトの名無しさん
12/12/24 22:46:13.42
ついにTcl/Tk 8.6が12/20にリリースされました。
926:デフォルトの名無しさん
12/12/26 21:31:39.97
SL4AでTcl動かそうと思ったけど、うまくいかんな。つまらん
927:デフォルトの名無しさん
13/01/18 03:10:56.99
ubuntuが出すタブレットPCでも動くのかな?
928:デフォルトの名無しさん
13/01/21 19:38:03.19
ActiveTcl 8.6.0.0リリースだよ。
929:デフォルトの名無しさん
13/02/19 07:16:05.65
特定のwidgetだけ再描画することは出来ないでしょうか?
textに数千行読む時にprogressbarを更新したいけど、その他の再描画は無駄なので止めたいのです。
updateだと全体を再描画になります。
930:デフォルトの名無しさん
13/02/21 22:20:12.72
特定widgetだけ再描画する方法は分からないけど、
textへの追加を1行ずつしないで、全部を一旦変数に入れて一発でinsertする、じゃダメなの?
931:デフォルトの名無しさん
13/02/22 21:07:25.94
C:\Program Files\Tcl\demos\Tk8.5\widget.tcl
Scales and Progress Bars 4. Progress bar
はupdate なし
configure命令
932:デフォルトの名無しさん
13/02/23 21:44:59.02
Tkの部品はconfig命令を使うと色や形の現在値は変更できるが、Tkは高速化の為に画面への反映は遅延表示させているので途中経過を表示せずにいきなり最終結果が表示されたりする。
プロバー表示では現在値を強制表示させる為にupdate命令を使うのが定石だがこれが禁じ手になると結構難しいか。
①930番さんの様にまとめて一発表示
②update命令間隔をを10秒置きとか極端に長くする
③その他の部品はforgetオプション等で退避しておいて後で表示
④?
ところでTkのtext表示は普通はそんなに遅くはないが改行文字なしの長い行を表示させると異様に遅くなるみたい。
933:デフォルトの名無しさん
13/03/06 21:36:21.62
SSD環境なので参考にならんかもしれませんが、2000文字x5000行のファイルでは、
5行おきのアップデートにすると秒単位で高速化されました。
それでもプログレスバー表示しない場合の11.5倍時間がかかりました。
create_file: 483288 microseconds per iteration
gets_lines: 271409 microseconds per iteration
read_bulk: 252275 microseconds per iteration
test_full_update: 5123759 microseconds per iteration
test_skip_update: 3374500 microseconds per iteration
test_no_update: 291779 microseconds per iteration
test_bulk_insert: 285029 microseconds per iteration
934:デフォルトの名無しさん
13/03/09 03:48:33.45
最初にファイルサイズ取得して、サイズに応じてupdateする行数変更するとか。
5000行のファイルに5行おきにプログレスバーを更新するってのが...
935:デフォルトの名無しさん
13/03/12 17:51:41.39
tcl8.6爆速なんだけど↓からだいぶ状況変わったの?
URLリンク(d.hatena.ne.jp)
この速さはただの再帰もループになってる?
5桁とかになると1分以上かかって他に大きく離される
これはループにしても変わらないから多倍長ライブラリの性能かな
936:デフォルトの名無しさん
13/03/12 18:29:56.59
すまん関数名同じだからかんちがいした
fib 38は固まるわ
937:デフォルトの名無しさん
13/03/12 22:01:59.60
>935
私の中古機械で試してみた。式をまとめると約10倍速くなった
どうしてこんなに違うのか??
fib <39088169> term <80312600 microseconds per iteration>
proc fib {n} {
if {$n < 2} { return $n }
return [expr {[fib [expr {$n - 1}]] +[fib [expr {$n - 2}]]}]
}
fib <39088169> term <714145387 microseconds per iteration>
proc fib {n} {
if {$n < 2} { return $n }
set a [expr $n - 2]
set b [expr $n - 1]
set x [fib $a]
set y [fib $b]
return [expr $x + $y]
}
938:デフォルトの名無しさん
13/03/15 22:54:42.21
>>937
exprの引数を{ }で囲むだけでだいぶ違うな
939:デフォルトの名無しさん
13/03/15 23:06:47.65
初心者が初心者に嘘を教えるスレです
940:デフォルトの名無しさん
13/03/15 23:08:30.06
exprの引数を{ }で囲むのは8.6以前からの定石。
2回評価させないようにする。
941:デフォルトの名無しさん
13/03/23 22:06:55.05
937です。より速くより汚く
proc fib {n} {
if {$n < 2} { return $n }
return [expr {[fib [incr n -2]] +[fib [incr n ]]}]
}
fib <39088169> term <72891401 microseconds per iteration> でした。
935 引用のページからC++を複写してVisualC++Express2008(要するに無料ソフト)を使って実行してみた
fib44=701408733
fib45=1134903170
fib46=1836311903
fib47=-1323752223
fib48=512559680
tcl/tk(ver8.5.13)でfib47 は
fib <2971215073> term <1253824233 microseconds per iteration>
1254秒!!。鈍足で正確でした。なっとく
速度、精度、価格、安直さ、どれも一つの側面でしかなく、それらを総合的に評価して最適ソフトを選択することが肝要だと思う。
942:929
13/03/24 10:09:02.93
ありがとうございます。規制されてて遅くなりました。
progressbarはupdate idletasksで表示が更新されましたが、古いPCのWindowsXPでは5~6秒程度updateしないと
メニュー部分が白くなって、その後はprogressbarも更新されなくなります。(update idletasksではダメ)
ということで、数秒おきにupdateしないとprogressbarが更新されません。
見た目を重視しているので無駄はあきらめることにしました。
943:デフォルトの名無しさん
13/03/31 08:08:41.45
Tcl/Tk 8.4.20予告 6/1(随分さきの話だが)に最終版リリース予定らしい。まだ8.4.を改良してたのか。
Tcl/Tk 8.4.20 Release Announcement
June 1, 2013
The Tcl Core Team is pleased to announce the 8.4.20 releases of the Tcl
dynamic language and the Tk toolkit. This is the twentieth and *FINAL*
patch release of Tcl/Tk 8.4. With this release, support for Tcl/Tk 8.4
comes to an end.
944:デフォルトの名無しさん
13/04/03 22:36:01.28
Tcl/Tk 8.5.14 Release Announcement
April 3, 2013
945:デフォルトの名無しさん
13/04/09 21:46:20.56
>>5の予想を裏切り2014年まで持つ勢いだが、
ActiveTcl 8.6.1.0とTclDevKit 6.0の登場が変えてくれることを願う。