Tcl/Tk‎ > ‎

Tcl/Tkのススメ

超簡単にGUIアプリケーションが作れるTcl/Tkを勧める理由

※動画もあります。見たい方はこちら

1.GUIが超簡単に出せる

どのくらい簡単なんでしょう?実際にやってみます。
インストール不要で、解凍するだけで使えます!

まず、wish86t.exeを起動します。
はい。画面が出ました!

次に、画面にボタンを出してみましょう。
次のコードを打ち込みます。(Ctrl + Vで貼り付けが効きます)
button .b1 -text "Hello World" -command {puts "Hello World"}
pack .b1
ボタンを連打するとHello Wolrdがどんどん表示されます。

一旦wish86t.exeを閉じて開き直してから、次のコードを打ち込んでみましょう。
set btnText "Hello World"
button .b1 -text $btnText -command {
  append btnText "!"
  .b1 configure -text $btnText
}
pack .b1
ボタンを連打すると!がどんどん増えてゆきます。
ね?簡単でしょう?

ちなみに、先程のをテキストファイルに保存して、wish86t.exeにドラッグアンドドロップでも実行することができます。
関連付けしてもOK。もちろん引数として渡してもOK。

ちなみに、Tkの見た目はちょっと古いですが、最近のTcl/Tkには
ttkというテーマ付きGUIが搭載されており、それを使うとネイティブのGUIを扱うこともできます。

単純な画面だけではなく、Canvasを使った様々なグラフィックも扱えます

なんかLinuxとかで見たことある雰囲気しません?

2.マルチプラットフォーム

 あ、すみません、1,2行でボタン表示できる言語は他にも有りましたね。
HSPとか。

でも、WindowsでもLinuxでもMacでも、Androidでも同じように動くのって、Tcl/Tkくらいだと思います。

あ、いえ、Javaも動くし、Pythonも動きますけれども。

ちなみに、Python/Tkinterとか、Ruby/Tkとか、Perl/Tkとか、マルチプラットフォームでGUI出せるやつ有りますが、
実はこれ、Tcl/TkのTkだけを切り離して別の言語に繋いだものです。

というのも、もともとTclは組み込み言語で、それをGUI拡張するツールキットがTkだったんです。
Python/Tkinterはこんなんですね。
from Tkinter import *

root = Tk()
button = Button(root, text = 'Python/Tkinter')
button.pack()
root.mainloop()
Tcl/Tkの同じソースはこれ。実は.b1の.」はルートを表しています。
button .b1 -text "Tcl/Tk"
pack .b1

3. 独特の文法と、強力なコマンド機能

 見ていてわかったかもしれませんが、Tcl/Tkの文法はちょっと独特です。
なぜかというと、すべてが"コマンド"であるためです。
Tclに文は存在せず、すべてはコマンドです。(ifやswitch、for、foreachでさえコマンドです。)

GUIがいらない場合は、tclshを使うとシェルのように使えます。

そしてなんと、不明なコマンドは外部コマンドであると仮定する」ため、calcと打てば電卓が起動しますし、
このようにping(Windowsのコマンド)を実行し、その結果をGUIに吐き出す、なんてこともこんなに簡単にできます。
短時間に実用性重視のものを作りたいときには非常に便利ですね。

(もちろん、環境依存のスクリプトになります。危険性等を考えるならば、
 set auto_noexec 1
 で簡単に無効にできます。もちろん無効にした状態でも、execコマンド等で同等のことができます。)


文法の例を例示してみます。
ちなみに、スペースは文法上必須です。(区切り文字です)
(変数名に実際日本語が使えますが、おすすめしません)

#変数代入
set 変数名 0
#インクリメント
incr 変数名 1
#計算して代入
set 計算値 [expr {2+3}]
↑[]でくくると、そのコマンドを実行した上で値とする (コマンド置換)
#計算して代入
set A 10
set B 20
set X [expr $A + $B]
↑変数の内容は、先頭に$をつけると展開される (変数置換)
#条件分岐
if {分岐条件 == 1} {
  putc "分岐しました"
}
↑{}はリスト表記。""も同じ。C言語のように{}をifの次の行に置くことはできない。1行完結は可能。
#コマンド追加
        ↓引数リストも{}によるリストにする
proc hello {x} {
  puts "Hello World!"
  puts $x
  return "OK"
}
hello mymam

と、ちょっと独特ですが、かといって非常に逸脱した変なコードというわけでもないことがわかります。

一方、
・グローバル変数(globalコマンド)とローカル変数、参照変数(upvar)
・名前空間の作成・管理
・エラー発生時のスタックトレース
・安全な実行のためのファイルシステム仮想化
・すべての変数は文字列として扱われつつ、内部では型を持っており高速処理
・正規表現等も含めた文字列処理が得意
・リスト、辞書、イベント処理などの機能を搭載
・すべてのコマンドはTcl上でリネーム・上書き・削除し独自の拡張をすることも可能 (ifやset、return、forなどもコマンドなので置換可能です!)
・TCPソケットを標準で搭載
・バイナリ処理も可能
・例外処理も搭載
・スマートポインタによる自動メモリ管理
・未知のコマンドに対する処理でさえ変更可能です("unknown"コマンドを定義することにより可能になります)
と、プログラミング言語としては不足ない機能が搭載されていることがわかります。

ソケット通信も簡単にかけたりします。
set sock [socket localhost 12345]
puts  $sock "Hello World"
flush $sock
puts  [gets $sock]
close $sock
Pure Tclの拡張を使うと、マルチプラットフォームなまま機能拡張の恩恵に預かることもできます。

ちなみに、TclもTkも、機能は増えれど、基本機能は変わっていないため、
かなり古い資料(1995年)のスクリプトでも平気で(あるいは軽微な修正で)動きます。
(お近くの図書館等で、古いTcl/Tkの入門書を探してみてください)

詳細な情報は、ページ最下部の参考サイトをご覧ください。

4. C言語に組み込める・拡張しやすい

もともと、Tclは、アプリケーションへの組み込み言語(拡張用スクリプト言語)として開発されました。
そのため、TclはC言語に組み込むのも、Tcl用拡張ライブラリを作成するのも非常に簡単にできるようになっています。

今日その用途で使われているLuaが1993年にリリースされていますが、
Tclは1988年に同様の用途で開発されていたのです。

そして、Tcl/Tkとなったのは1990年のことで、Tclの1拡張でしかなかったTkですが、当時のその画期的かつ楽にGUIが扱えるということから、
Tcl/TkとしてGUIスクリプティング環境として人気となりました。

現在では表立って出てくるのは、TclはCiscoの機器のスクリプティング言語や、EDAのマクロ処理用言語として残るくらいになってしまいましたが、
(LuaがYAMAHAのルータや、wiresharkのマクロ処理言語に使われているのと似ていますね)
Tkは未だに根強い人気が残っており、Python/Tkinterや、Ruby/Tk、Perl/Tkとして各環境に残っています。

Arduino IDEや、wxMaxima、Python、その他いろいろなところに組み込まれています。
(そのため、PC内を検索すると.tclのファイルがわさっと出てくることが有ります)


しかし、だからといって潰えてしまった言語というわけではなく、GUIを扱うために便利な言語であることには変わりはなく、
Tcl/Tk 8.6.6は2016年7月27日に更新がなされており、
今なおメンテナンスと機能拡張が進んでいる言語でもあります。

最近では、古臭いGUIの代わりに、ネイティブなテーマを利用できるttkなどが追加されています。

一方、他の言語と異なり、割と早いうちに現在の仕様に安定し、破壊的な変更や非互換はあまりないため、安心して使うことができます。
さらに、スタブを使うことで、バージョンの違うTclにも互換性を持ったライブラリを作成できるようになっています。

C言語に組み込む場合の例を見てみましょう。(拡張版のWishを作るのに等しいです)
これにより、testprocというコマンドが増え、呼び出すとC関数が呼び出されます。
ここでは外部のファイル(script.tcl)を実行していますが、evalを使ってC言語内にコードを埋め込むことも可能です。

#include "tcl.h"//Tclライブラリ
#include "tk.h"//Tkライブラリ
#pragma comment(lib, "..\\lib\\tcl86.lib")
#pragma comment(lib, "..\\lib\\tk86.lib")

//独自コマンドを定義
int proc(ClientData clientData, Tcl_Interp* interp, int argc, const char* argv[])
{
	//argc:引数の数 argv[0]:自分自身(コマンド名) argv[1]~:引数
	printf("Call!\n"); //呼ばれたらCall!と表示

	char *retvalue = "0";
	Tcl_SetResult(interp, retvalue, TCL_VOLATILE);	//戻り値を設定
	return TCL_OK; //終了コード:正常終了(TCL_ERRORだとそこで例外発生)
}

int main(int argc, char* argv[])
{
	Tcl_Interp *interp = Tcl_CreateInterp(); //インタプリタを作成
	Tcl_FindExecutable(argv[0]); //初期化前準備
	Tcl_Init(interp); //Tclを初期化(init.tclをロード)
	Tk_Init(interp);//Tkを初期化(GUIライブラリをロード)

	Tcl_CreateCommand(interp,"testproc",proc,NULL,NULL);//コマンドを登録する
	Tcl_EvalFile(interp, "script.tcl"); //インタプリタで外部のファイルを実行
	Tk_MainLoop();//Tkのイベントループへ
	//ウィンドウが閉じられるとここに戻ってくる

	Tcl_DeleteInterp(interp); //インタプリタのお片付け
	return 0;
}
また、C言語側からTcl_SetVarなどを使って、Tcl側の変数の取得・操作もできます。
もちろん文字列として取得できますし、数値としてほしければ数値として受け取ることもできます(余計な変換を避け、内部表現のまま受け取れます)。
より高度な操作のための関数もたくさんありますが、簡単な動作であればこの程度で十分です。
(C言語側で長時間処理が行われる場合でも、updateコマンドをevalでC側から実行すれば、GUI処理は継続します。)

実行に必要なのは、
・このCソースから生成した実行ファイル
・tcl86t.dll
・tk86t.dll
・libフォルダ(Tcl/Tkの様々な処理用スクリプトが入っています)
だけです。コンパクトですね。

どうですか?簡単でしょう?


5. オープンソースであり、環境構築も楽チン

Tcl/Tkのライセンスは非常にゆるいものです。
他のGUIライブラリのように、GPL等々考える必要も、料金を払う必要もありません。

ただし、ActiveTclは別です。多彩な機能拡張が行われており、パッケージ化されている反面、再配布や商用利用の際には13万円の追加料金を払い、厳密な契約を行う必要があります。
そのため、自前でコンパイルするか、追加ライセンスのない配布元(下記に記載のTck/Tk for Windows 8.6.1等)を利用することをおすすめします。

一応、本サイトでも配布しています → Tcl/Tk配布ページ

*Google翻訳
このソフトウェアは、カリフォルニア大学、サン・マイクロシステムズ社、Scriptics Corporation、ActiveState Corporation、Apple Inc.およびその他の当事者の代理人によって著作権が保護されています。
以下の条件は、個々のファイルに明示的に否認しない限り、ソフトウェアに関連するすべてのファイルに適用されます。

著者は、既存の著作権表示がすべてのコピーに保持され、この通知がすべての配布物にそのまま含まれていれば、
本ソフトウェアおよびそのドキュメントの使用、コピー、変更、配布、およびライセンスを何らかの目的で使用することを許可します。
承認された使用には、書面による合意、ライセンス、またはロイヤルティ料金は必要ありません。
このソフトウェアの変更は著作者の著作権で保護されている可能性があり、適用される各ファイルの最初のページに
新しい条件が明記されている場合は、ここに記載されているライセンス条項に従う必要はありません。

著作者またはディストリビュータは、たとえ著作者またはディストリビュータが、本ソフトウエア、
そのドキュメントまたはそれらの任意の誘導体を使用して生じた直接的、間接的、偶発的、または必然的な損害に対して、たとえ著者がそのような損害の可能性。
作者およびディストリビューターは、商品性、特定の目的への適合性および非侵害性の黙示的な保証を含む(ただしこれらに限定されない)いかなる保証も明確に否認します。
本ソフトウェアは「現状のまま」提供され、作者およびディストリビュータは、メンテナンス、サポート、アップデート、エンハンス、または修正を提供する義務を負いません。

政府使用:政府は、米国政府のために本ソフトウェアを取得する場合、第52.227.19条(c)の連邦取得規則(FAR)に定義されている
ソフトウェアおよび関連文書に「制限付き権利」のみを有する2)。国防総省に代わってソフトウェアを取得する場合、
ソフトウェアは「商用コンピュータソフトウェア」に分類され、政府はDFARの252.227-7013(b)(3)項に定義される「制限付き権利」のみを有する。
上記にかかわらず、著者は、本ライセンスで指定された条件に従ってソフトウェアを使用および配布する許可を米国政府およびその他の代理人に与える。

*原文
This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
Corporation and other parties.  The following terms apply to all files
associated with the software unless explicitly disclaimed in
individual files.

The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.

IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
MODIFICATIONS.

GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7014 (b) (3) of DFARs.  Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.

Tcl/Tkをおすすめする人

1. C言語や多言語で、黒い画面に心折れそうになった人

 C言語や他の言語で、文字表示やキーボードは簡単だけど、マウスやタッチパネルを使ったGUIが作りたい...」って人、
結構いるのではないでしょうか。そんな人はTcl/Tkをとりあえず試してみましょう。
きっとびっくりします。

2. GUIを使ってみたいが、面倒な処理をしたくない人

 C言語や、そこまで行かなくても他の言語でGUI画面を使おうとして、チャレンジした人、あるいは、
日常的にそういったプログラムを組んでいる人もいるかもしれません。
 そういった人は、GUIを扱うのに、またボタンやウィンドウを管理するのに非常に面倒なコードが必要になることを
よくご存知なのではないでしょうか。

3. GUIとプログラム本体を分離したい人

 Tcl/Tkは、単体でも高度なプログラムを作成することはできますが、本来C言語に組み込まれることを前提とした言語です。
そのため、C言語のプログラムに組み込んでGUIフロンドエンドとして使うもよし、DLLを作成してTcl/Tkを拡張してもよし、
ソケットやパイプも使えるので、完全に分離したプログラムを作成してもよし。
 得意分野を分担して使うのに非常に向いています。

4. マルチプラットフォームに動くGUIを作りたい人

 Tcl/Tkはマルチプラットフォームであり、Windows/Linux/Mac/Android等、実行環境があればどこでも使えます。
Javaでも使えますが、コンパイル不要の手軽さは便利ですよ。

Tcl/Tkを進めるに当たっての注意点

正直、日本で流行っている言語とはいえないため、解説サイト等は古いものが多く、サイトによっては閉鎖してしまっているところもあります。
本ページ下部に参考サイトを記載いたしましたので、そちらを是非参考にしてください。

また、古い書籍でも参考になる箇所が非常に多いため、amazonや、地元図書館等でTcl/Tkの本を探してみるのもありです。
筆者は「はじめてのTcl/Tk」技術評論社(1995年)や、「Tcl/Tkプログラミング入門」オーム社(1995年)を参考図書にしています。

参考サイト

Tcl/Tk配布ページ (Visual Studio 2015 Communityによるコンパイル。libファイルも同梱しています。)
zip配布のため、とりあえず試すのに便利です。


Tck/Tk for Windows 8.6.1 (フルセットですが、MinGWによるコンパイルのため、VisualCでのコンパイル用のlibファイルはありません)
インストーラ形式なので、環境導入させたい場合は便利。

以下どのサイトもリファレンスとして非常に便利です。

Tcl/Tk - wikipedia (結構参考になります)

Tcl 入門編

Tcl 8.4.1 Manual Command Reference(日本語)

Tcl/Tk お気楽 GUI プログラミング入門編

Tcl/TkでWindowsプログラミング(Webホストサービスが終了してしまったので、WebArchiveを利用しています。)

もっとTcl/Tk

Tcl8.5.19/Tk8.5.19 Documentation (公式ドキュメント。調べたいコマンドがわかっている場合はこれ)

TCL/TK Command Reference Guide (英語だが超強力。一覧できる)

Tcl/Tk 8.4 Quick Reference Guide

開発補助ツール等

SpecTcl - GUIビルダー (Tcl/Tk 8.3/8.4対応)
https://sourceforge.net/projects/spectcl/
Comments