リストボックス(Listbox)

リストボックスは,一般にたくさんのリストの中から1つまたは複数の要素を選択させたいときに用います.

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クラスのインスタンス変数およびメソッドを以下に示します.

TkListBoxクラスのインスタンス変数とメソッド(抄)
インスタンス変数名 役割
background 背景色.
foreground 前景色.
borderwidth 枠の幅.整数値で指定.
cursor マウスカーソルの形.
highlightcolor ウィジェットにフォーカスがある時の枠の色.
highlightthickness ウィジェットにフォーカスがある時の枠の幅.
relief ウィジェットの凹凸.'raised'または'sunken'で指定.
selectbackground セレクト時の背景色.
selectborderwidth セレクト時の枠の太さ.
xscrollcommand 横スクロールバーを連動させるときに使用します.詳説は後節で.
yscrollcommand 縦スクロールバーを連動させるときに使用します.詳説は後節で.
height リストボックスの高さ.
width リストボックスのの幅.
selectmode 選択のしかたを指定します.'single','browse','multiple'または'extended'で指定します.
  • 'single': 1項目のみ選択可.ドラッグしても選択位置は移動しません.
  • 'browse': 1項目のみ選択可.ドラッグすると選択位置は移動します.
  • '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ボタンを押したあとのプロンプトの出力です.


戻る