トップページtech
981コメント378KB

●●●●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/
07587532011/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とかを投げるほうが良いような気がしてきたけど。
0759デフォルトの名無しさん2011/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ですが…)。
仕組み上ではこれで悪くないはず?なので、これで行こうと思います。

ほんとにありがとうございます。
07607582011/06/13(月) 00:33:27.18
>>759
どこで見たか思い出ないけど、Tcl_AsyncCreate()した時(=拡張のロード時)に
interpを保存しておいて、AsyncHandler()の引数がNULLの場合は保存したinterpを
使っていた。同じことをして動いた記憶はある。
引数がNULLということはコマンドを実行していないので、保存していたinterpを
使っても問題にはならないらしい。
逆に、複数のinterpが存在するとAsyncHandler()が呼ばれた時に渡されるinterpが
通知先である保証が無いのかな?
NULLでないのは何らかのコマンドが終了した瞬間だから、保存していたinterpを
使っても安全な気もするから、実行するコマンドが絶対に成功するようにすれば
それでいいんでは?
0761デフォルトの名無しさん2011/06/13(月) 23:10:25.66
>>760
おぉ、詳細なご説明ありがとうございます。
ぼんやりとしていた理解が、明確になった気がします。

やっぱり同じ事を考えた方はいらっしゃるんですね。
というか、スレッドの終了をvwaitで待ちたいとか割とありえる状況な気がしますが、
ぐぐってもKodersでもまともにヒットしないってどういうこと…
この辺がニッチな言語の、もの悲しいとこですね。
0762デフォルトの名無しさん2011/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. ドキュメントにはあるんだけど...
http://docs.activestate.com/activetcl/8.5/tclxml/index.html

だいたい、8.4のtar玉は28Mあったのに8.5は20Mしかない

http://downloads.activestate.com/ActiveTcl/releases/8.4.19.5/
http://downloads.activestate.com/ActiveTcl/releases/8.5.9.2/
07637622011/06/16(木) 02:37:19.87
>>116-119
に解答がありました。 失礼しました。
0764天使 ◆uL5esZLBSE 2011/07/05(火) 02:14:58.01
↓↓
「「「「「「「「「 に解答がありました。 失礼しました。 」」」」」」」」」(爆ッゴミッッ!
0765デフォルトの名無しさん2011/07/06(水) 17:28:55.22

<<<<<<<<<<<<< 「「「「「「「「「 に解答がありました。 失礼しました。 」」」」」」」」」(爆ッゴミッッ! >>>>>>>>>>>>>(キリッ!!!きリッ!!!!
↑↑(きリキリッッ!キリ

土方が何をほざいて(笑)



天使#test_s

「天使の煽り」の提供でお送りしました
0766デフォルトの名無しさん2011/07/07(木) 21:59:23.84
>>763
それは2007年当時の話。今のActiveTclでは
teacupで必要な拡張をダウソするのがナウ。
0767本田2011/07/11(月) 23:50:09.19
[Tcl-announce] ActiveTcl 8.5.10.0 released
http://code.activestate.com/lists/tcl-announce/371/
0768本田2011/07/12(火) 00:00:32.94
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-html.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-linux-ix86-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-linux-x86_64-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-macosx10.5-i386-x86_64-threaded.dmg
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-win32-ix86-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/ActiveTcl8.5.10.0.294993-win32-x86_64-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/MD5SUM
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.0/SHA256SUM
0769本田2011/07/12(火) 21:01:46.78
Teacup
http://wiki.tcl.tk/17305
Teacup provides access to the Tcl Extension Archive.
It is the client to the TEApot server.
It is distributed with ActiveTcl by ActiveState.
0770デフォルトの名無しさん2011/07/26(火) 13:53:55.22
canvasで書いた円と線の交差判定をしたいです。
計算しなくてもできるって聞いたんですがどうすればいいですか?
0771本田2011/07/30(土) 06:39:19.48
円じゃなくて長方形領域ようだけど。

http://homepage3.nifty.com/kaku-chan/tcl_tk/chapter_231.html
pathName addtag tag overlapping x1 y1 x2 y2
x1 y1 x2 y2 を座標とする長方形領域に少しでも重なるアイテムに対して tag で示されるタグを付けます。 x1 は x2 以下、y1 は y2 以下の数値でなければなりません。
0772本田2011/07/30(土) 06:43:22.91
http://downloads.activestate.com/ActiveTcl/releases/
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-html.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-ix86-threaded.tar.gzhttp://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-x86_64-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-macosx10.5-i386-x86_64-threaded.dmg
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-win32-ix86-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-win32-x86_64-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/MD5SUM
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/SHA256SUM
0773本田2011/07/30(土) 06:52:55.54
×http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-ix86-threaded.tar.gzhttp://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-x86_64-threaded.tar.gz


http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-ix86-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.10.1/ActiveTcl8.5.10.1.295062-linux-x86_64-threaded.tar.gz
0774デフォルトの名無しさん2011/08/03(水) 22:02:33.46
Tclって複数行にわたるコメントってできるの?Cの/* ...
... */みたいな。
エディタに頼って全行頭をイゲタるしかないのか。
if 0 {
} ってのもなんだかなぁ...
0775デフォルトの名無しさん2011/08/03(水) 22:39:32.06
どこのJava
0776デフォルトの名無しさん2011/08/05(金) 22:47:02.97
>>774
できない。諦めろ。
0777デフォルトの名無しさん2011/08/05(金) 22:48:49.89
proc rem comment {}

rem {
こめんととめんと
こめんとこめんとおおおお!!!
}
0778デフォルトの名無しさん2011/08/06(土) 00:08:22.24
コメント途中に閉じ中カッコであぼーん
0779デフォルトの名無しさん2011/08/06(土) 17:21:09.88
# コメント1\
コメント2\
コメント3#

でいけそうだけどどうかな?
# もコマンドみたいなものだから \ で続けて書けそうな気がする

最後の # は無くてもいいけど終端という意味で
0780デフォルトの名無しさん2011/08/06(土) 21:28:04.24
それは毎行つけるので行頭#とあんまり大差ないな
0781デフォルトの名無しさん2011/08/07(日) 08:03:02.17
Emacsで範囲指定して
M-x comment-region
0782デフォルトの名無しさん2011/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
}; -->
0783デフォルトの名無しさん2011/08/09(火) 21:18:47.70
set comment {
コメント
}
>>782>>777 と同じく、中括弧がバランスしないと破綻する。
中括弧だけなら、
set comment "
コメント
"
という手もあるけど、" と カギ括弧[] を意識しないといけない
0784デフォルトの名無しさん2011/08/09(火) 21:26:01.94
#コマンドの振る舞いって謎だな

{}は改行も含めて一つの要素にするはずだから、

# {あほ
ばか
}

で#コマンドは{あほ改行ばか改行}を一つの引数とするはずなのに、{あほ まででコメントが終了しちゃうよね。

set a {あほ
ばか
}

だとちゃんとaに{あほ改行ばか改行}が入るのに
0785デフォルトの名無しさん2011/08/09(火) 22:50:35.79
#はTclにおいてもコマンドではない。が正解。
0786デフォルトの名無しさん2011/08/10(水) 22:11:16.68
なるほど
#はコマンドの置ける位置に置かねばならないがコマンドではなく行末までのコメントとして処理されるということか
行末の\継続は生きてる状態で。
0787デフォルトの名無しさん2011/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>イベントが発生するらしい。
これって仕様なのかな。
0788デフォルトの名無しさん2011/08/28(日) 21:06:23.24
>>787
仕様。
但し正確には、子供のぶんまでイベントが発生するのではなくて、子供が処理するイベントに
toplevelのぶんが含まれている。
"puts destroyed %W" とかするとわかると思う。
あとはbindtagsのman-page参照。
0789デフォルトの名無しさん2011/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]
とかはできる。
0790デフォルトの名無しさん2011/08/29(月) 23:52:37.47
AssocQueryStringWというWindows APIが使いたかったので、
http://msdn.microsoft.com/en-us/library/bb773471(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) のことだと思うんですが、どの辺が間違ってるんでしょうか?

0791デフォルトの名無しさん2011/08/31(水) 00:16:00.83
>>788 >>789
ありがd
とりあえず

bind .w1 <Destroy> ...

のかわりに

bind .w1.b1 <Destroy> ...

にしたら(子供がいないので)一回だけ処理されるので
目的は達成できてますが、動作が疑問だったんで。
0792デフォルトの名無しさん2011/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だとクラッシュするのお・・・。
0793デフォルトの名無しさん2011/09/09(金) 01:55:06.30
>>792
どうもありがとう。
32bit版Win7ではクラッシュ。型が違うのかなあ。。。
0794デフォルトの名無しさん2011/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が壊れてる?
0795デフォルトの名無しさん2011/09/10(土) 01:09:56.11
脳が障害を起こしました
0796デフォルトの名無しさん2011/09/12(月) 00:35:13.36
>>794

なんかJITデバッガのせいでイベントログには残らないみたいですが、
デバッガには以下が表示されてました。
wish84.exe の 0x76d93d52 (shell32.dll) でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x000003e8 を読み込み中にアクセス違反が発生しました。

CAssocArray::GetStringという関数でエラーになってるらしいですが、何に使われてるのかは不明。
0797デフォルトの名無しさん2011/10/22(土) 17:14:45.57
Tcl/tkって、伺かみたいなGUIは実現できるのでしょうか?
0798デフォルトの名無しさん2011/10/25(火) 23:08:12.87
> 797

この辺があればできるのではないかと。

二次元キャラ -> Tk canvas + Imgでpngファイルが使える + TkTrans.dllで背景透過
サウンド -> snack
Windows API, COMの利用 -> TWAPIとFfidl, tcom

設定画面とかは普通にTkで。垢抜けた見た目を求めるならtile拡張

知識の泉
* ActiveTclに添付のヘルプ
* http://wiki.tcl.tk/
* http://www.tkdocs.com/

ActiveTclに標準添付じゃない拡張たち

TkTrans.dll
http://goo.gl/gwXa1

TWAPI
http://twapi.magicsplat.com/

Ffidl
http://elf.org/ffidl/

0799デフォルトの名無しさん2011/10/30(日) 13:19:20.79
canvasで、ある位置の色を取得したいのですが可能でしょうか?
どうすれば取得できるでしょうか?
0800デフォルトの名無しさん2011/10/31(月) 19:58:14.80
> 799

できたよ。
http://wp.me/pSK5T-4g
0801デフォルトの名無しさん2011/10/31(月) 21:12:04.23
>>800
GDIですか、windows用ですね
参考にさせてもらいます
ありがとうございます!
0802デフォルトの名無しさん2011/11/11(金) 22:55:33.88
ActiveTcl 8.5.10->8.5.11 ファイル容量少し小さくなった
0803デフォルトの名無しさん2011/11/18(金) 23:57:56.40
envってグローバルだったんだね。
proc内でglobalつけないで使ってたら
ぜんぜん環境変数にアクセスできなくて、
半日はまった。orz
0804デフォルトの名無しさん2011/11/19(土) 01:12:58.43
>>803
env使うってCGIでも作ってるの?
組み込み変数は全部グローバルだから、
一度info globalsのリストに目を通しておくとそういうときにピンとくると思う。
0805デフォルトの名無しさん2011/11/19(土) 07:50:33.66
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295402-html.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295402-linux-ix86-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295402-linux-x86_64-threaded.tar.gz
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295402-macosx10.5-i386-x86_64-threaded.dmg
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295402-win32-ix86-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/ActiveTcl8.5.11.0.295407-win32-x86_64-threaded.exe
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/MD5SUM
http://downloads.activestate.com/ActiveTcl/releases/8.5.11.0/SHA256SUM
0806デフォルトの名無しさん2011/11/19(土) 12:32:51.20
誰もが一度ははまるstr
0807デフォルトの名無しさん2011/11/27(日) 12:50:30.83
ゲームでキャラを移動させるような場合、bindを用いてカーソルキーで操作すると
キーボードのオートリピート機能のせいで、動き始めた直後に一瞬動きが止まります。
スムーズに動くようにするにはどうしたら良いのでしょうか?
0808デフォルトの名無しさん2011/11/28(月) 00:52:09.92
inp(0), inp(1)
0809デフォルトの名無しさん2011/11/29(火) 00:48:45.31
>>807
簡単なテストコード見せて
0810デフォルトの名無しさん2011/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だけで解決する方法はないのでしょうか?
0811デフォルトの名無しさん2011/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

方向を一つの変数でまとめてるけど方向別にすれば斜め移動も出来る
0812デフォルトの名無しさん2011/11/30(水) 00:27:19.26
>>810
どういうゲームかわからないけど、イベントループを自分で管理するべき。
そして、そのイベントループの中で、KeyPressで動かしはじめて、
KeyReleaseが来るまで動かし続ける。簡単には>>811みたいな。
ちゃんとしたゲームしたいならasteroids.tclが参考になると思う。→http://wiki.tcl.tk/13601
0813デフォルトの名無しさん2011/11/30(水) 12:06:12.14
カーソルキーを押しっぱなしにすると
ずっとKeyPressのままってわけじゃない。
KeyPressとKeyReleaseが交互に発生する。
だからそれは全然アドバイスになってない。
0814デフォルトの名無しさん2011/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
0815デフォルトの名無しさん2011/12/01(木) 13:31:06.09
>>813
普通はそうならない。
コントロールパッド本体に連射機能がついてるとかならあり得るかもしれないけど。
0816デフォルトの名無しさん2011/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}
08178162011/12/01(木) 21:35:31.25
このサンプルを動かして、aを押しっぱなしにしたら
1と0が交互に表示されるはず。
そうならなかったらよっぽど特殊なキーボードを使ってるんだろう。
0818デフォルトの名無しさん2011/12/02(金) 11:26:05.96
連射機能付きJOYstickだろ
0819デフォルトの名無しさん2011/12/02(金) 15:07:54.99
>>816,817

そのコード片を試したわけでないので何だが、
通常、キーを押しっぱなしにすると
KeyPress/KeyDownは複数飛んでくるが
KeyReleaseは離したときに1回飛んでくるだけじゃないのかね。
0820デフォルトの名無しさん2011/12/02(金) 19:29:43.54
試さないで何言ってる
0821デフォルトの名無しさん2011/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}
0822デフォルトの名無しさん2011/12/02(金) 23:24:20.45
>>821
ループ無し
http://i.imgur.com/byFnN.png
0823デフォルトの名無しさん2011/12/02(金) 23:50:43.04
ループ無し
http://ozcircle.net/_uploader/60860336

俺の環境ではこの通り
0824デフォルトの名無しさん2011/12/03(土) 10:24:08.91
だから〜環境依存の問題の臭いがしてるのに、
バージョンもOSも書かずに「俺の環境」じゃ
誰もこれ以上何もできんだろ
0825デフォルトの名無しさん2011/12/03(土) 11:50:49.20
>>824
Windows7とWindowsXPとLinux Mint 11で確認済
というか、そうならない環境が例外だと思われる
08268252011/12/03(土) 11:54:22.55
Tclのバージョンは8.4と8.5で試したが、結果は同じ
0827本田2011/12/04(日) 21:44:12.75
>>825
もし同じPCでテストしてるなら。
BIOSが同じだから結果が同じ可能性がある。
0828デフォルトの名無しさん2011/12/04(日) 21:57:17.27
>>827
俺も試してみたけど>>823みたいになった。
3台のPCでテストしたんだけど変わらない。
ってことは環境依存だとしても、そういうのって結構多いんじゃない?
0829本田2011/12/04(日) 23:25:19.71
キーのリピート速度と遅延時間を設定するには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/052keyrepert.html
 同じキーを押し続けると、そのキーが連続で入力できる。
連続で入力される速度を「リピート速度」、キーを押してからリピートを開始するまでの時間を「遅延時間」と呼ぶ。
 キーのリピート速度と遅延時間は、kbdrateコマンドで変更できる。
オプションを何も指定しないでkbdrateコマンドを実行すると、リピート速度が10.9cps(1秒当たり10.9文字)に、遅延時間が250ミリ秒(ms)に設定される。
これが、Linuxのデフォルトの数値だ。
 使用可能なオプションは、-s、-r、-dだ。
0830本田2011/12/04(日) 23:52:04.88
キー・リピート (key repeat)
http://www.atmarkit.co.jp/icd/root/32/5785932.html
 キーを押したままにしたときに、連続的にそのキーが繰り返し入力されたように扱うしくみ。
一般的には、キーが押し下げられてから、キー・リピート処理が開始されるまでの間隔と、
リピート間隔(連続的にキー入力を発生させる際の時間間隔)を設定できる。
0831デフォルトの名無しさん2011/12/05(月) 23:44:17.05
>>814>>815のものですが、>>810を見て、てっきりWindowsの話と思ってました。

これが答えになるんじゃないでしょうか。
X Window SystemではオートリピートでPress/Releaseが交互に発生するらしいです。
http://goo.gl/q3zCD

Windowsでなるという人いないはずだよね?
0832デフォルトの名無しさん2011/12/05(月) 23:57:02.19
あと、確認の仕方は以下で十分です。

bind . <KeyPress> {puts KeyPress}
bind . <KeyRelease> {puts KeyRelease}
console show
0833デフォルトの名無しさん2011/12/06(火) 10:23:09.00
WindowsのオートリピートってX Windowと挙動が違うの?
オートリピートなんてみんな同じだと思ってた
0834デフォルトの名無しさん2011/12/06(火) 21:17:09.62
X Windowって言うな
0835デフォルトの名無しさん2011/12/06(火) 21:57:13.95
>>834
いみふ
0836デフォルトの名無しさん2011/12/06(火) 22:04:04.24
X Windowsというと嫌がる人ってのは見たことあるけどな
X Windowだったら単純にSystemを省略しただけだから何が悪いのかわけわからん
0837デフォルトの名無しさん2011/12/07(水) 00:27:18.67
>>835, >>836
同感。
0838デフォルトの名無しさん2011/12/07(水) 07:30:17.47
ま、開発元は嫌がってるけどね。
0839デフォルトの名無しさん2011/12/07(水) 15:53:36.77
略すなら X のみだろ常考
0840デフォルトの名無しさん2011/12/07(水) 17:55:46.65
X Windowsでいいよ
呼び方なんぞどうでもいい
0841デフォルトの名無しさん2011/12/07(水) 19:52:34.30
tclvfsってどんなもので、どう使えばいいんでしょうか?
意外と情報が少ないし、たまたま見つけたサンプルコードのほとんどがまともに動かないんですけど。
0842デフォルトの名無しさん2011/12/07(水) 20:00:14.15
SX-Windowでいい。
国産だし。
0843デフォルトの名無しさん2011/12/07(水) 20:06:01.06
zipとかjarみたいなもんだと勝手に想像 freewrapみたいなものを自前で実装とか
0844デフォルトの名無しさん2011/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とかいろいろあるみたいだけど使ったことはない。
0845本田2011/12/08(木) 23:16:45.72
>>841
Practical Programming in Tcl and Tk, 4th ed
http://beedub.com/book/4th/

http://beedub.com/book/4th/Starkit.pdf
http://beedub.com/book/4th/welch_examples.zip
0846デフォルトの名無しさん2011/12/10(土) 07:15:51.33
tclで'A'という文字からアスキーコード65を得るには、どうやればいいでしょうか?
0847デフォルトの名無しさん2011/12/10(土) 12:04:09.29
>>846
binary scan "A" c val
puts $val
0848デフォルトの名無しさん2011/12/10(土) 13:17:19.43
>>847
ありがとうございます
0849本田2011/12/17(土) 12:06:21.27
Graphics with TCL/TK
http://www.youtube.com/watch?v=hHFOFefE1YM
0850デフォルトの名無しさん2011/12/24(土) 12:21:45.17
toplevelで作ったウィンドウを手で動かしてから、
wm withdrawで非表示にし、wm deiconifyで再表示させると、
最初に作られた位置に出現します。
(厳密に言うとそれよりちょっと右下)

Tkの仕様なのかウィンドウマネージャの仕様なのか、
消えた時の位置に再表示されるのが自然だと思うんですが。
それともやり方が間違ってるんだろうか?

環境:
Tk 8.4
Soralis 10
CDE 1.6.3
0851デフォルトの名無しさん2012/01/03(火) 19:11:53.53
>>5
さすがだねw
0852デフォルトの名無しさん2012/01/22(日) 19:54:12.53
書けない?
0853デフォルトの名無しさん2012/01/22(日) 19:54:41.21
あれ、書けた。あけおめ。
0854デフォルトの名無しさんNGNG?2BP(1250)
ネタがなにも無くて暇だ
0855デフォルトの名無しさん2012/02/01(水) 23:51:44.54
850には答えてやんないの?
0856デフォルトの名無しさん2012/02/02(木) 00:46:23.97
>>855
だってTk8.4もう使ってないし、CDEも使ったこと無いし、
Sorarisの環境も無いし、ウィンドウマネージャーのせいな気がするから、
環境が無いと確認のしようがないし、
0857デフォルトの名無しさん2012/02/04(土) 13:14:29.62
850です。

ですよねぇ〜。
仕事のマシンで環境いじれないし、
Tcl/Tkなんて(自分以外)ほとんど使ってないからなぁー。
0858デフォルトの名無しさん2012/02/13(月) 21:11:55.61
Tclは実行前にバイトコードにコンパイルされ、高速化が図られていると、説明されています。
することにもよると思いますが、bash,perl,ruby,pythonと比べると速さはどうなんでしょう?
プログラムミング未経験者の、素朴な疑問です。
■ このスレッドは過去ログ倉庫に格納されています