Tcl/Tkでお手軽GUI
みなさん、こんにちは。スタッフの高木です。ここのところ風変わりなネタばかり書いていますが、今回も例外ではありません。
いろいろなソフトウェアを開発していると、最終的な製品には必要なくても、開発段階ではデバッグ等にGUIが必要、またはあれば便利という状況が多々あります。私の場合、WindowsもLinuxもMacも使いますので、できればどの環境でもほぼ同じように使えるGUIツールキットがあれば助かります。そんなときに重宝するのがTcl/Tkです。
Tcl/Tkは古くさい印象があるかもしれません。あるいは、まったく聞いたことすらない方さえいることでしょう。しかし、現在でもTcl/Tkは開発が継続中であり、新機能も追加されています。ライセンス的にかなり緩いのも魅力です。
主にスクリプト言語として知られるTcl/Tkですが、元々はアプリケーションに組み込みコマンド言語の機能を提供するためのライブラリでした。なので、既存のプログラムに後からくっつけて、GUIをはじめとした機能を追加するにはもってこいなのです。
Tcl/TkのGUIツールキットであるTkは、Perl、Ruby、PHPなどさまざまな言語にバインディングされています。しかし、そもそもはCのライブラリであり、Cからであれば、最新のTcl/Tkを制限無く使うことができます。もちろんC++からでもです。
C++からTcl/Tkを使うための簡単なコード例を挙げてみることにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <tk.h> int main(int argc, char* argv[]) { Tcl_Interp* interp = Tcl_CreateInterp(); Tcl_FindExecutable(argv[0]); Tcl_Init(interp); Tk_Init(interp); char script[] = "pack [label .l -text {Hello, World!}]"; Tcl_Eval(interp, script); Tk_MainLoop(); Tcl_Finalize(); } |
このコードは、ウィンドウに「Hello, World!」と書いたラベルを貼るだけの簡単なものです。初期化と終了処理を除けば、わずか3行で書けてしまいます。Tcl以外のスクリプト言語からTkを使う場合でもそれほど大差はありません。
後付けでGUI機能を追加するのであれば、GUI専用のスレッドを作ってそこでTcl/Tkを使うほうが便利です。せっかくなので、別スレッドでTcl/Tkを使う方法も挙げておきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <thread> #include <tk.h> int main(int argc, char* argv[]) { std::thread tkthread([argv]() { Tcl_Interp* interp = Tcl_CreateInterp(); Tcl_FindExecutable(argv[0]); Tcl_Init(interp); Tk_Init(interp); char script[] = "pack [label .l -text {Hello, World!}]"; Tcl_Eval(interp, script); Tk_MainLoop(); Tcl_Finalize(); }); tkthread.join(); } |
ほとんど変わりませんが、これで期待した結果は得られます。
組込み開発では、実行環境となるハードウェアが完成していない状態でソフトウェアの開発を進めていかないといけないケースが多々あります。そんな場合でも、Tcl/Tkでハードウェアのエミュレーションを行えば、かなりのところまで作り込みができたりします。
それ以外にもいろいと応用価値があると思います。どんな応用があるか、みなさんも考えてみてください。