C + Tcl/TkでHello, World!

Tcl/TkはCやC++のプログラムにちょっとしたGUIを付けるのに便利です。Tcl/Tkはスクリプト言語であって、ライブラリとして使えることを知らない人も多いようですので、今回はCからTcl/Tkを呼び出してHello, World!をウィンドウで表示するプログラムを紹介することにします。

CからTcl/Tkを使うには、当然のことですが、Tcl/Tkがインストールされていなければなりません。Windowsであれば、Cygwinなら標準パッケージに含まれていますので、setup時にTcl/Tkを一緒にインストールすればOKです。なお、Cygwinの場合はX Wndow Serverを起動しておく必要があります。MinGWでも、Tcl/TkがMinGW本体と同じところからダウンロードできるはずですので、それをインストールしましょう。Visual C++を使うのであれば、Active Tclをダウンロードしてください。

Linuxであれば、はじめからインストールされている場合もありますし、なければapt-getやyumなどでインストールしましょう。Macの場合はMac Portsを使えばよいでしょう。もちろん、LinuxでもMacでも、ソースからコンパイルしてインストールすることもできます。

さて、準備ができたら、プログラムを書きましょう。Hello, World!のプログラムは次のようになります。

#include <tk.h>

int main(int argc, char *argv[])
{
    Tcl_Interp* interp = Tcl_CreateInterp();
    Tcl_FindExecutable(argv[0]);
    Tcl_Init(interp);
    Tk_Init(interp);

    Tcl_Eval(interp, "pack [label .l -text \"Hello, World!\"]");
    Tk_MainLoop();
    Tcl_Exit(0);
    return 0;
}

printfやputsで出力するだけのHello, World!に比べれば複雑ですが、この程度のコーディング量でGUIが作れるのであれば十分魅力的といえるのではないでしょうか?

TkのTcl以外のスクリプト言語へのバインディングであるPerl/TkやRuby/TkやPHP/Tkでも同じぐらいのコードを書くことになりますので、Cだから特別に面倒ということではありません。

このプログラムをビルドするときには、libtcl.aやlibtk.aといったライブラリをリンクする必要があります(環境によって微妙にファイル名が変わる場合があります)。

コマンドラインで動作する既存のプログラムにGUIを追加する場合、Tcl/Tkで書いたスクリプトからそのプログラムを呼び出してもよいですし、GUI専用のスレッドを作って、そこでTcl/Tkの上記のようなコードを書けばGUIを追加することができます。

上記のサンプルコードでは、CからTclのスクリプトを呼び出していますが、TclのスクリプトからCの関数を呼び出したり、変数に値を設定・取得することもできますので、慣れてくれば自在にGUIを操ることができるようになるでしょう。