20190311

tcl/tkよく使うメモ

最近は、tcl/tkに手を出し始めた。
VBAも継続中。pythonも。
tcl/tkは、昔のスクリプト言語らしい。
もともと、pysideやってたのに、時代に逆行してる気がする。。。

tcl/tkの入手

Tcl/tkとして、 ActiveState ActiveTcl 8.5.18.0を使った。 DLして、インストールしたらできた。

これを、なるべく不自由なく使いたい。
pythonでできそうなことをやろうとしたらどんなことをすべきか書いたメモ。

基本的な文法をちょろっと書いた2000文字程度のページだったはずが、ActiveTclを調べてたら、パッケージ(ライブラリ)が気になって…文字数が肥大化した。

使用してみた感じ

ActiveTclのwindowsのスタート画面.png

windowsのcmd上から、

tclsh

と入力すると、tclのあの%が表示される。 この画面を、「tclのシェルを起動した」というらしい。
「インタプリタ画面を出した」ではダメなんだろうか。
tclとだけ打っても無反応なのは注意したい。

名前説明
ActiveTclHelpは、コマンドリファレンスですな。
Licenseテキストファイルが出てくる。ライセンス関連。再配布なんかしないから関係ない。
Readmereadmeが入っている。
Tclshx.x(xには番号)シェルが立ち上がる。
Tkこれはすごくいい。Tkを使ったGUIの例と、そのコードが見れる。pyqtgraphのexampleみたい。
tkcontkのコンソールが開く。
uninstall ActiveTcl x.x.xx.xアンインストール
wishxxwishとは、「簡素な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

最後の空白行1行も、一応実行してね。
下のような感じになります。
tcl tk_実行.png


ちなみにマラソンは完走した。4:55くらいだった。サブ4までの道のりは長い。
(自分用メモ) マークダウンは、visual studio codeで書いて、Mark Rightのプレビューをさくらのブログにコピー→いったん保存→コードの改行を治す。→タグP、h3などの余計なスタイルを空白で置換して軽くするで作る事にする。
posted by yuchan at 07:00 | Comment(292) | tcl/tk