Ruby/TkではTkListboxクラスが相当します.
使用例を示します.
#!/usr/local/bin/ruby
require 'tk'
listbox = TkListbox.new(nil,
'height' => 8,
'width' => 20,
'selectmode' => 'multiple')
listbox.pack('side' => 'left', 'fill' => 'both')
arr = ['Japan','Korea','China']
listbox.insert('end', *arr)
Tk.mainloop
上記のプログラムを走らせると,下のようになります.Chinaをクリックしたところです.Chinaが選択状態になっています.
なお,
listbox.insert('end', *arr)は,listbox.insert('end', 'Japan', 'Korea', 'China')と同じです.
TkListboxクラスのインスタンス変数およびメソッドを以下に示します.
| インスタンス変数名 | 役割 |
|---|---|
| background | 背景色. |
| foreground | 前景色. |
| borderwidth | 枠の幅.整数値で指定. |
| cursor | マウスカーソルの形. |
| highlightcolor | ウィジェットにフォーカスがある時の枠の色. |
| highlightthickness | ウィジェットにフォーカスがある時の枠の幅. |
| relief | ウィジェットの凹凸.'raised'または'sunken'で指定. |
| selectbackground | セレクト時の背景色. |
| selectborderwidth | セレクト時の枠の太さ. |
| xscrollcommand | 横スクロールバーを連動させるときに使用します.詳説は後節で. |
| yscrollcommand | 縦スクロールバーを連動させるときに使用します.詳説は後節で. |
| height | リストボックスの高さ. |
| width | リストボックスのの幅. |
| selectmode | 選択のしかたを指定します.'single','browse','multiple'または'extended'で指定します.
|
| メソッド名 | 機能 |
| insert(index , str1[, str2...]) | indexの位置にstr1[,str2...]の文字列を挿入します. |
| curselection | 現在選択状態にある全ての項目の位置を配列で返します.選択項目がない場合は空配列を返します. |
| index名 | 役割 |
| 'number' | リストボックスの先頭を0としてnumber番目の項目を表現します. |
| 'active' | マウスカーソルの位置にある項目です. |
| 'end' | リストボックスの最後の項目です. |
リストボックスは基本的に多数の候補を持つリストがあります.そのため,スクロールバーと併用することは非常に多いです.スクロールバーの説明はあと回しにして,選択した要素をプロンプトに出力するサンプルをつくってみました.
(ちょっと複雑なプログラムになってしまいました.)
#!/usr/local/bin/ruby
require 'tk'
frame = TkFrame.new(nil)
frame.pack('side'=>'top')
scrollbar = TkScrollbar.new(frame)
listbox = TkListbox.new(frame,
'height' => 8,
'width' => 20,
'selectmode' => 'multiple',
'yscrollcommand' => proc{|first, last|scrollbar.set(first, last)})
scrollbar.command(proc{|first,last| listbox.yview(first,last)})
scrollbar.pack('side' => 'right', 'fill' => 'y')
listbox.pack('side' => 'left', 'fill' => 'both')
arr = (['Japan','Korea','North Korea', 'China', 'Taiwan', 'Mongolia', 'Indonesia', 'Singapore', 'Philippinines', 'Thailand', 'Viet Nam', 'Cambodia', 'Lao\'s Republic', 'Malaysia', 'Myanmar', 'Brunei Darussalam']).sort
listbox.insert('end', *arr)
button = TkButton.new(nil,
'text' => 'print',
'command' => proc{(listbox.curselection).each{|i| print arr[i], "\n"}})
button.pack('side' => 'top')
Tk.mainloop
初期状態です.
'China','Japan','Korea'を選択しました.
printボタンを押したあとのプロンプトの出力です.