「Tcl/Tk」は実績あるGUIツールキットと軽量コマンド言語
「Tcl/Tk」はスクリプト言語「Tcl」とGUIツールキット「Tk」を組み合わせたものです。手軽にGUI画面を持つデスクトップアプリを開発できるため、35年以上、さまざまなツール開発で使われています。今回は、Tcl/Tkについて紹介します。
Tcl/Tkとは
「Tcl/Tk」はクロスプラットフォームのスクリプト言語「Tcl」と、Tclのために用意されたGUIツールキットの「Tk」の組合せを指した名称です。1988年にカリフォルニア大学バークレー校のジョン・ケネス・オースターハウト氏が開発しました。
「Tcl」はC言語で書かれたアプリに組み込むための、コマンド言語として開発されました。Tclという名前も、Tool Command Languageに由来しています。言語構造がシンプルで実用的なツールを作ることを目指して設計されています。
そして「Tk」は、Tcl用に開発されたGUIツールキットです。簡単なコードで、ボタンやエディタなどのGUI画面を作成できるように工夫されています。
開発者のオースターハウト氏がサン・マイクロシステムズに在籍していた1990年代は、同社で開発が進められましたが、2000年からはオープンソースとして開発されることになり、その後も精力的に開発が続けられています。
現在では、Tclよりも、そのライブラリのTkの方が広く利用されています。Pythonや、Ruby、Perlなど、さまざまなスクリプト言語からも使えるように移植されました。PythonのTkinterや、RubyのRuby/Tk、PerlのPerl/Tkが、その言語からTkを利用したGUIライブラリです。
Tcl/Tkをインストールしよう
Tcl/Tkの公式Webサイトでは、ソースコードのみを配布しており、バイナリは、Active Tcl(http://www.activestate.com/activetcl)や、BAWT(http://www.bawt.tcl3d.org/)などから配布されています。
ここでは、BAWTからダウンロードしてみます。Windowsの場合は、こちらのページで配布されています。ページの下の方までスクロールするか、ページ内検索で「Windows installer」を検索して、「Tcl/Tk 8.x.x」(xは任意の数字)を選んでインストーラーをダウンロードしましょう。
ダウンロードしたら、ダブルクリックして実行してください。[Next]を選んでいくとインストールが完了します。
macOSの場合は、Homebrewを使ってインストールするのが簡単です。ターミナル.appを起動して、以下のコマンドを入力しましょう。
# Homebrewをインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 続いて Tcl/Tkをインストール
brew install tcl-tk
Tcl/Tkで一番簡単なプログラム
Tcl/Tkをインストールすると、「tclsh」と「wish」という二つのコマンドがインストールされています。「tclsh」はTclの対話型の実行環境となっており、「wish」がファイルを指定してプログラムを実行するインタプリタとなっています。
ここでは「wish」を使ってみましょう。以下のような「hello.tcl」というファイルを作成しましょう。以下は、ウィンドウに「こんにちは」というボタンを作成して配置するものです。ボタンを押すとプログラムを終了します。
# ボタンを作成 --- (*1)
button .b -text "こんにちは!" -command exit
# ボタンを表示 --- (*2)
pack .b
ターミナル(WindowsならPowerShell、macOSならターミナル.app)を起動して、以下のコマンドを実行しましょう。
wish hello.tcl
実行すると、以下のような画面が表示されます。(画面はmacOSで実行したところです。)
うまく実行できたら、改めてプログラムを確認してみましょう。プログラムは、たった2行ですが、多くの情報を含んでいます。
まず、プログラムの(*1)は、button関数で始まっています。これは、ボタンを生成するという意味です。「.b」がボタンの名前です、「-text "文字列"」でボタンのラベルを指定し、「-command exit」がボタンを押したらプログラムを終了するという意味になります。そして、(*2)では、作成したボタンを画面に表示するためのpack関数です。
FizzBuzz問題の結果をリストに表示するプログラム
それでは、本連載で恒例となっている、FizzBuzz問題を解くプログラムを作ってみましょう。FizzBuzz問題とは次のようなものです。
> 1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
それでは、プログラムを作ってみましょう。以下のプログラムを「fizzbuzz.tcl」という名前で保存しましょう。同じプログラムをこちらにもアップしています。
# メインウィンドウの初期化 --- (*1)
wm title . "FizzBuzz"
wm geometry . 600x400
# fizzbuzz関数を定義 --- (*2)
proc fizzbuzz { n } {
# 変数$nがFizzかBuzzかを判定 --- (*2a)
set is_fizz [expr {($n % 3) == 0}]
set is_buzz [expr {($n % 5) == 0}]
# 判定結果に応じて結果を返す --- (*3)
if {$is_fizz && $is_buzz} { return "FizzBuzz" }
if {$is_fizz} { return "Fizz" }
if ($is_buzz) { return "Buzz" }
return $n
}
# リストボックスに表示するためのリストを作成 --- (*4)
set a_list {}
# fizzbuzz関数を使って1から100までの結果を取得 --- (*5)
for {set i 1} {$i <= 100} {incr i} {
set result [fizzbuzz $i]
# 画面に結果を表示
puts $result
# リストに結果を追加
lappend a_list $result
}
# リストボックスの作成 --- (*6)
listbox .list -listvariable a_list -width 600 -height 400
pack .list
ターミナルで以下のコマンドを入力するとプログラムが実行されます。
wish fizzbuzz.tcl
プログラムを確認してみましょう。(*1)ではメインウィンドウを初期化します。