tcl/tkの入手
Tcl/tkとして、 ActiveState ActiveTcl 8.5.18.0を使った。 DLして、インストールしたらできた。
これを、なるべく不自由なく使いたい。
pythonでできそうなことをやろうとしたらどんなことをすべきか書いたメモ。
基本的な文法をちょろっと書いた2000文字程度のページだったはずが、ActiveTclを調べてたら、パッケージ(ライブラリ)が気になって…文字数が肥大化した。
使用してみた感じ
windowsのcmd上から、
tclsh
と入力すると、tclのあの%が表示される。 この画面を、「tclのシェルを起動した」というらしい。
「インタプリタ画面を出した」ではダメなんだろうか。
tclとだけ打っても無反応なのは注意したい。
名前 | 説明 |
---|---|
ActiveTcl | Helpは、コマンドリファレンスですな。 |
License | テキストファイルが出てくる。ライセンス関連。再配布なんかしないから関係ない。 |
Readme | readmeが入っている。 |
Tclshx.x(xには番号) | シェルが立ち上がる。 |
Tk | これはすごくいい。Tkを使ったGUIの例と、そのコードが見れる。pyqtgraphのexampleみたい。 |
tkcon | tkのコンソールが開く。 |
uninstall ActiveTcl x.x.xx.x | アンインストール |
wishxx | wishとは、「簡素なwindowingshell」らしい。使い方は、ここにあるように、ボタンを追加してみたら、ボタンが出てくるよ。 |
teacup
ライブラリのアップデートや追加に使う。
teacup update
teacup update
をtclshxx(xxはバージョン)で実行すると、下記のように最新?のライブラリの検索が始まる。
teacup update
Retrieving package logger 0.9.4 tcl ...@http://teapot.activestate.com... Ok
Retrieving package sqlite3 3.8.10.2 win32-ix86 ...@http://teapot.activestate.com... Ok
Retrieving package struct::pool 1.2.3 tcl ...@http://teapot.activestate.com... Ok
Retrieving package tls 1.6.7.1 win32-ix86 ...@http://teapot.activestate.com... Ok
.
.
.
これが延々続く。
これをしないと、mathが使えない。
pythonも環境設定大事だもんね。なんでもpython基準で申し訳ない。
最後にこれが表示される。
Installed 4 newer packages
Installed 695 unknown packages
新しいバージョンがあれば更新されるし、
最新バージョンなら"Ok"と表示される。
問題は、何も表示されない場合。
結局、mathは何も表示されていなかった。
これでインストールできるんじゃないの!?
文字通り、updateだけでした。
teacup install
mathが入っていなかったので、mathを使おうとしても
package require math
tcl can't find package math
となってしまう。
mathを入れたい。
% teacup install math
Resolving math ... [package math 1.2.5 tcl ... Already installed in repository, probing dependencies]
Resolving Tcl 8.0 -is package ... [package Tcl 8.5.18 _ ... Installed outside repository, probing dependencies]
そしたら、下記のように打てば、
package require math
下記のように表示される。
% package require math
1.2.5
早速入れたmathを使ってみる。
package require math
と入れただけじゃ使用できない。
package require math::statistics
ここまで打たないと、統計系のコマンドは使えない。
平均値を求めるコマンド。
package require math::statistics
math::statistics::mean "1 4 2";#1,4,2の平均値を求める。
% package require math::statistics
1.0
% math::statistics::mean "1 4 2"
2.3333333333333335
おー動いちゃいましたか。
math::constant定数 eやπ
定数は、コマンドではなく、定数がそのまま入っている。
だから、先頭に書いてしまうと「そんなコマンド無い」と返されてしまう。
package require math::statistics
math::constants::e
% puts $math::constants::e
% math::constants::e
invalid command name "math::constants::e"
% puts $math::constants::e
2.718281828459045
% puts $math::constants::pi
3.141592653589793
使用可能なライブラリの一覧
結局、目的のが入ったのかどうか分からない。
package names
と入力すると、package require できる一覧が表示されます。
ただ、長すぎるので、全部読み切れない。
テキスト長にコピーして目的の文字を検索するのが手っ取り早い。
下記部分を最初に書いていた。
最初は、ここより下の文章を書いていた。 いろいろできるようになっていったら、うれしくなって、どんどん肥大化していった。
tcl/tkよく使うメモ
プログラム言語は、pythonから入ったのでtcl/tkとかよく分からない。
基本的に、どの言語でも、np.linspaceのような等差数列を出すコマンドが欲しいと思ってしまう。
だから、下のほうに、tcl/tkでもnp.linspace風の等差数列を実現するfor構文を書いておいた。こういうときって、for書くしかないのね。procで自作関数かするしかないのか。"未開拓の土地に来"た感あるなぁ。
文字列の表示 puts
printじゃなくputs。 echoでも通ります。
##############
#文字列の表示#
##############
# 文字列は、""か{}で囲んだら、表示された。
puts "Hello world."
echo Hello
変数の代入 set,$
変数は、
set 変数名 値
その値をputsで表示したいのであれば、
puts $変数名
############
#変数の表示#
############
set a 1
puts $a
コメントアウト #もしくは;
すでに何か書いてある行にコメントアウトするのであれば、
○○ [×× ◇◇◇ △△△];# コメントアウトの#の前に;(セミコロン)が要る
何も書いてない行にコメントアウトを入れるのであれば、
#何も書かれていない行には、最初から#を書けばいい。
################
#コメントアウト#
################
#コメントアウト
puts "abc" ;#行末尾では、コメントアウトの仕方が変わる。セミコロンの後に#じゃないとダメ。
配列
配列。変数の中に複数の値を入れるあれ。 代入するとき、添字(index)を指定。 取り出すときも、そのindexを指定。
############
#配列の表示#
############
set b(0) 5
set b(1) 1
set b(2) 7
set b(3) 8
puts $b(2)
リスト
リストも、変数の中に、複数の値が入っている。
リストを作るには、
"1 10 100 1000"
のように、スペース区切りで入力する。
####################
#リストは配列じゃない#
################
#スペース区切りの文字列で、リスト。
set c "2 4 6 8 10"
#puts $c(2);#配列のようにindexingしてはいけない。
puts [lindex $c 3];#返り血は8。リストのindexingはlindexという専用の関数を使用する。
#ちなみに、[]はコマンドをくくるときに使う。
ちなみに、上記の、配列のように添え字付きで、putsすると、
puts $c(2)
can't read "a(1)": variable isn't array
と返ってくる。
繰返し構文
for、incr
###########
#for 構文 #
###########
for {set i 1} {$i <= 5} {incr i} {
puts $i
}
incrは、
incr i 2
とすれば、2ずつ増える。
pythonのnp.linspace風に、tcl/tkでも等差数列が欲しい。
incrは便利なようで不便。なぜなら、整数型しか使えないから。
自分は、numpyのlinspaceのような関数を見つけられていないから、for構文で小数点以下の数字を作りたいのだけれども、そういう時はincrを使わずに、
###########
#for 構文 #
###########
for {set i 0} {$i <= 5} {set i [expr {$i+0.1}] } {
puts $i
}
foreach
foreachで、for以外の変数で繰り返す。
forだと、整数で繰り返す。
foreachなら、文字列や小数点のある数値でも繰り返せる。
#########
#foreach#
#########
foreach i {A B C} {
puts $i
}
このforeachは、上記のリストとかで使う。
0埋め
ここでも連番画像やテキストファイルの取得をするかもしれないので、0埋めの方法を書いておく。
#######
#0埋め#
#######
puts [format "0 padding %0.5d" 1]
tk
tkで、GUIを作る。 工夫したのは、整数型しか入力しない点。
package require Tk
proc pushed {} {
puts $::eleID1
}
proc exit {} {
destroy .
}
wm title . "Set and print integer" ;# タイトル設定
#準備して、
set eleID1 0
entry .entr1 -textvariable eleID1 -validate all -vcmd {string is int %P};# -validatecommand {if {[string first "%s" "1234567890."] == -1} {return 1} else {return 0}}
label .l1 -text "Enter intefer"
button .btn1 -text "OK." -command pushed
button .btn2 -text "Cancel." -command exit
#設置する。
pack .entr1 .l1 .btn1 .btn2 -side left