Ruby/Tk で動くスクリプトを、ネストしながらさっさと配置する方法を考える

投稿者: | 2015年11月29日

Ruby/Tk の需要というのはニッチだ。Pythonの波に乗り遅れてしまっている。趣味のツールとしてRubyプログラミングがちょっとしたい。一瞬で簡単に書きたい。
そういう需要はきっと少なくないと思う。それには Ruby/Tk がぴったりだ。

にもかかわらず、Ruby/Tk でスラスラとウィジェットを配置していくのは難しい。
それは、パーツの配置を、コードの見た目と一致させることが難しいからだと思う。

例えば、HTMLなら、


イヌ

吾輩はイヌである。

ネコ

吾輩はネコである。


こんな感じで、見た目とコードがある程度一致する。部品の中に部品をネストしていけばいい。
しかし、Ruby/Tk ではネストによって部品を配置することは一般的にはしないことが多い。
packやgridを使って部品を配置していていくからだ。
これを愚直にやるとすると、事前の計画性がすごく必要になるから大変だ。

それでも無理やり同じように、コードと配置が一致するようにをRuby/Tkを書いてみることはできる。
ブロックを多用すればいい。

サンプル1

tk1

なんだ、できるじゃん。
うまくいっているように見える。ところが問題が発生する。それは、ボタンにちょっと気の利いた機能を与えようとすると起こる。
たとえば、”イヌ”ボタンや”ネコ”ボタンを押した時に、わんわん、にゃー、と出力するようにしたいとする。
この、バインドがなかなかうまくいかない。

サンプル2

tk1

er

残念なことに、このサンプルは動かないのである。TkButtonには、#wanwanとか#nyaとかいうメソッドは実装されていないとして、エラーが出る。
仕方がないので、ボタンに名前を与えてみることにする。まずはインスタンス変数を使ってみる。

これも動かないのである。それは、@dog_button, @cat_buttonは、それぞれTkFrameに所属するインスタンス変数であって、GUIのインスタンス変数とは同名でも別物だからである。
インスタンス変数を、ブロックを越えて参照することはできない。それでは、ローカル変数ならどうか?

tk1
terminal

実は、これは動く。ローカル変数は、ブロックを越えて参照することができるからだ。問題は、最初にローカル変数を宣言しなければならないことである。
それでも普通はローカル変数よりもインスタンス変数を使いたいと思うので、こんな風にしてみる。
ローカル変数を宣言して、あとからインスタンス変数に詰め込むのである。

tk2
terminal
tk1
これでようやく思ったように動くようになる。なにやら、ところどころ、面倒臭い記述が目立つ。

今のところ、これがRuby/Tkですばやく落書きするベストな方法だと思っている。
それでも、世の中もっといいやり方があると思う。そんな方法を知っていたら教えてほしい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です