こんにちは、高木です。

ここのところTcl/Tkのラッパークラスを作っています。前回はwidgetクラスを派生してlabelクラスを作りました。Tkには多数のウィジェットがありますが、派生クラスはほとんど同じコードの連続になります。こういうときには以前連載していたPHPによる前処理が便利です。

最初に前回作ったlabelクラスをもう一度確認しておきましょう。

ほかのウィジェット、たとえばbuttonのラッパークラスを作るにはどうすればいいかを考えてみます。どうやら「label」となっているところを「button」に単純に置き換えるだけでも問題なさそうです。

単純に置き換えるだけでいいなら、labelクラスのコードをPHPの文字列として保持しておいて、PHPのstr_replace関数で置換するだけでもよさそうです。ただ、それではあまりにも融通がききませんので、「label」にあたる部分を$typeという変数にして埋め込むことを考えましょう。

その方針で作ったPHPの関数が下記になります。

あとは、生成するウィジェットの種類の数だけmake_widget_class関数を呼び出してあげればOKです。今回はとりあえずlabelとbuttonだけにしますが、種類が増えても同じことです。

これでウィジェットクラスを量産できるようになりました。もし、特別なメンバーを追加する必要が出てきた場合は、make_widget_class関数に引数を追加してコールバック関数を渡してあげれば対応できますね。

現状のwidgetクラスでは、オプションの指定をコンストラクタでしか行うことができません。次回はTcl/Tkのコマンドでいうconfigureとcgetに相当するメンバー関数を追加していくことにします。