永井@知能.九工大です.

From: Takeshi Honda <moecho21 / yahoo.co.jp>
Subject: [ruby-list:41241] ruby/Tk でプルダウンリスト
Date: Mon, 10 Oct 2005 22:03:01 +0900
Message-ID: <20051010130258.65498.qmail / web2802.mail.bbt.yahoo.co.jp>
> ruby/Tkで下のリンクにあるようなプルダウンリストを作るに
> はどうしたらいいのでしょうか?

combobox ウィジェットというやつのことですよね?
ここでは二通りの方法を紹介しておきます.

ひとつは combobox ウィジェットを含む Tk 拡張を使うことです.
Ruby/Tk でサポートしている Tk 拡張では,
BWidget 拡張, Iwidgets 拡張, Tile 拡張にそれぞれの 
combobox ウィジェットが含まれています.
クラス名はそれぞれ
  Tk::BWidget::ComboBox
  Tk::Iwidgets::Combobox
  Tk::Tile::TCombobox
です.
当然ですが,使いたい Tk 拡張がご利用環境の Tcl/Tk から
利用可能な形でインストールされていなければいけません.
例えば ActiveTcl バイナリパッケージにはこれらの拡張が
含まれていますから,Ruby の tcltklib がその ActiveTcl の
ライブラリを使うように make されていれば使えるはずです.
使い方はそれぞれの Tcl/Tk でのマニュアルを参照した上で,
Ruby/Tk での wrapper である
  tkextlib/bwidget/combobox.rb
  tkextlib/iwidgets/combobox.rb
  tkextlib/tile/tcombobox.rb
を見てもらえばわかると思います.

もうひとつは,Ruby のソースアーカイブに含まれている
Ruby/Tk のサンプルの内の tkcombobox.rb を使ってもらうことです.
Ruby のソースを展開した際にできる ext/tk/sample ディレクトリに
置かれています.
これには TkAutoScrollbox クラスと TkComobox クラスとが定義されており,
それらのサンプルであると同時にライブラリとしても使えます.

TkAutoScrollbox クラスは TkListbox クラスのサブクラスで,
自動スクロールタブを持ったリストボックスウィジェットです.
自動スクロールタブの位置にマウスカーソルを置くと
リストボックスの内容が一定のスピードでスクロールします.
スクロール開始までの時間とスクロール速度は指定可能です.

多分今回ご希望のものであろう TkCombobox クラスは 
TkEntry クラスのサブクラスです.
選択リストの表示には TkAutoScrollbox を使っています.
使い方はサンプルの中身を見ていただければわかるでしょう.
デフォルト値の指定も実例で理解できるはずです.

TkCombobox の内容をキーボードで修正することを禁止したければ,
バインディングで行ってください.
例えばバインドタグリスト (bindtags) から TkEntry を除外して
エントリウィジェットの機能をなくしてしまうとか,
キー入力イベントを無視する (Tk.callback_break を実行して
TkEntry のバインディングが実行されなくする) ような
バインディングを追加するなどの方法です.
state 属性を disabled にしてしまうと,プルダウンリストでの変更も
受け付けなくなってしまいます.

以上のいずれも気に入らなければ,複数のウィジェットを組み合わせて
ご自分で作成いただくしかありません.
サンプルの TkCombobox はそのための叩き台か参考くらいには
なると思いますので,せめて目を通すだけでもしていただければ幸いです.
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai / ai.kyutech.ac.jp