新規作成  編集  Ruby-GNOME2 Project Website  ページ一覧  検索  更新履歴  編集履歴  RSS  ログイン

gtk2-tut-spinbuttons

スピンボタン

スピンボタンウィジェットは一般にユーザがある範囲から数値を選択できるようにするために用いられる. これはテキストエントリボックスとその横にある上および下向きのアロウボタンから構成される. これらのボタンを押すことで選択可能な範囲内で値が "スピン" アップまたはダウンする. エントリボックスに直接値を入力することもできる.

スピンボタンは0以上の小数点以下の桁数を扱うことができ,任意の大きさでインクリメント/デクリメントを行うことができる. ボタンの1つを押し続けた場合,押し続けた時間によって値の変化を加速するようにオプションで設定できる.

スピンボタンは,扱うことができる値の範囲に関する情報を保持するためにアジャストメント?を使用する. アジャストメントを使用するおかげで,スピンボタンはより強力なものとなる.

アジャストメントウィジェットは以下のようにして生成することを思い出そう. 引数を見ればアジャストメントがどのような情報を保持しているかが分かる:

Gtk::Adjustment.new(value, lower, upper, step_increment, page_increment, page_size)

アジャストメントのこれらの属性はスピンボタンでは次のように用いられる:

value
スピンボタンの初期値
lower
値の下限値
upper
値の上限値
step_increment
ボタンをマウスボタン1で押した場合のインクリメント/デクリメント値
page_increment
ボタンをマウスボタン2で押した場合のインクリメント/デクリメント値
page_size
使用しない

さらに,ボタンの1つをマウスボタン3で押すことで,直接上限値または下限値にジャンプすることができる.

それではスピンボタンを作成する方法を見てみよう:

Gtk::SpinButton.new(adjustment, climb_rate, digits)

adjustment引数でスピンボタンで使用するアジャストメントオブジェクトを指定する.

climb_rate引数は0.0から1.0の間の値を取り,スピンボタンの加速の割合を指定する.

digits引数は表示される数値の小数点以下の桁数である.

スピンボタン作成後も以下のメソッドを用いてこれらの属性を再設定できる:

Gtk::SpinButton#configure(adjustment, climb_rate, digits)

またアジャストメント,climb_rate,小数点以下の桁数は以下のメソッドを用いて個別に取得,設定することができる

Gtk::SpinButton#adjustment
Gtk::SpinButton#climb_rate
Gtk::SpinButton#digits

Gtk::SpinButton#adjustment=(adjustment)
Gtk::SpinButton#climb_rate=(climb_rate)
Gtk::SpinButton#digits=(digits)

Gtk::SpinButton#set_adjustment(adjustment)
Gtk::SpinButton#set_climb_rate(clibm_rate)
Gtk::SpinButton#set_digits(digits)

スピンボタンに現在表示されている値は次のメソッドで変えることができる:

Gtk::SpinButton#value=(value)
Gtk::SpinButton#set_value(value)

スピンボタンの現在の値は次のメソッドで浮動小数点または整数値として取得することができる:

Gtk::SpinButton#value          # 浮動小数点数
Gtk::SpinButton#value_as_int   # 整数

スピンボタンの値を相対的に変えたいときは次のメソッドを使用する:

Gtk::SpinButton#spin(direction, increment)

direction引数には以下のいずれかを指定する.

Gtk::SpinButton::STEP_FORWARDまたはGtk::SpinButton::STEP_BACKWARD
スピンボタンの値はincrementによって指定された量だけ変化する.ただしincrementが0の場合はアジャストメントのstep_increment分だけ変化する.
Gtk::SpinButton::PAGE_FORWARDまたはGtk::SpinButton::PAGE_BACKWARD
incrementの値に関わらず,アジャストメントのpage_increment分だけ変化する.
Gtk::SpinButton::HOME
アジャストメントのlowerにスピンボタンの値を設定する.
Gtk::SpinButton::END
アジャストメントのupperにスピンボタンの値を設定する.
Gtk::SpinButton::USER_DEFINED
incrementで指定された量だけ変化する.

スピンボタンの範囲の属性を設定したり取得したりするメソッドについてはこのくらいにして,今度はスピンボタンの動作に関するメソッドを見てみよう.

最初のメソッドはスピンボタンのテキストボックスが数値のみを含むように制限するもので,ユーザが数値以外のものをスピンボタンのテキストボックスに入力することを防ぐことができる.

Gtk::SpinButton#numeric=(numeric)
Gtk::SpinButton#set_numeric(numeric)

numericにはtrueまたはfalseを指定する. trueを指定すれば数値のみ入力可能となる.

現在の状態はGtk::SpinButton#numeric?で取得できる.

スピンボタンが上限値と下限値を連続的に繋ぐ(wrap around)かどうかは以下のメソッドで設定できる:

Gtk::SpinButton#wrap=(wrap)
Gtk::SpinButton#set_wrap(wrap)

値を最も近いアジャストメントのstep_incrementの倍数に丸めるには次のメソッドを使用する:

Gtk::SpinButton#snap_to_ticks=(snap_to_ticks)
Gtk::SpinButton#set_snap_to_ticks(snap_to_ticks)

スピンボタンのアップデートポリシは次の関数で変更できる:

Gtk::SpinButton#update_policy=(policy)
Gtk::SpinButton#set_update_policy(policy)

policyに指定できる値はGtk::SpinButton::UPDATE_ALWAYSまたはGtk::SpinButton::UPDATE_IF_VALIDのいずれかである.

これらのポリシィは入力されたテキストを解析しアジャストメントの値に適合させる時のスピンボタンの動作に影響を与える.

Gtk::SpinButton::UPDATE_IF_VALID
スピンボタンは入力テキストがアジャストメントで指定された範囲内の数値の場合だけその値を変える.そうでない場合は現在の値が再設定される.
Gtk::SpinButton::UPDATE_ALWAYS
テキストを数値に変換する間エラーは無視される。

最後に,次のメソッドを用いて明示的にスピンボタンをアップデートできる:

Gtk::SpinButton#update

spinbutton.png それではいつものようにサンプルを見てみよう.

#! /usr/bin/env ruby

require 'gtk2'

def get_value(spin, label, type)
	label.set_text(
		case type
		when :Int
			"%d" % spin.value
		when :Float
			"%0.*f" % [spin.digits, spin.value]
		else
			"0"
		end
	)
end

window = Gtk::Window.new
window.signal_connect("destroy") {Gtk.main_quit}
window.title = "Spin Button"

main_vbox = Gtk::VBox.new(false, 5)
main_vbox.border_width = 10
window.add(main_vbox)

frame = Gtk::Frame.new("Not accelerated")
main_vbox.pack_start(frame, true, true, 0)

vbox = Gtk::VBox.new(false, 0)
vbox.border_width = 5
frame.add(vbox)

hbox = Gtk::HBox.new(false, 0)
vbox.pack_start(hbox, true, true, 5)

vbox2 = Gtk::VBox.new(false, 0)
hbox.pack_start(vbox2, true, true, 5)

label = Gtk::Label.new("Day :")
label.set_alignment(0, 0.5)
vbox2.pack_start(label, false, true, 0)

adj = Gtk::Adjustment.new(1.0, 1.0, 31.0, 1.0, 5.0, 0.0)

spinner = Gtk::SpinButton.new(adj, 0, 0)
spinner.wrap = true
#spinner.shadow_type = Gtk::SHADOW_OUT
vbox2.pack_start(spinner, false, true, 0)

vbox2 = Gtk::VBox.new(false, 0)
hbox.pack_start(vbox2, true, true, 5)

label = Gtk::Label.new("Month :")
label.set_alignment(0, 0.5)
vbox2.pack_start(label, false, true, 0)

adj = Gtk::Adjustment.new(1.0, 1.0, 12.0, 1.0, 5.0, 0.0)

spinner = Gtk::SpinButton.new(adj, 0, 0)
spinner.wrap = true
#spinner.shadow_type = Gtk::SHADOW_ETCHED_IN
vbox2.pack_start(spinner, false, true, 0)

vbox2 = Gtk::VBox.new(false, 0)
hbox.pack_start(vbox2, true, true, 5)

label = Gtk::Label.new("Year :")
label.set_alignment(0, 0.5)
vbox2.pack_start(label, false, true, 0)

adj = Gtk::Adjustment.new(1998.0, 0.0, 2100.0, 1.0, 100.0, 0.0)

spinner = Gtk::SpinButton.new(adj, 0, 0)
spinner.wrap = true
#spinner.shadow_type = Gtk::SHADOW_IN
spinner.set_size_request(55, -1)
vbox2.pack_start(spinner, false, true, 0)

frame = Gtk::Frame.new("Accelerated")
main_vbox.pack_start(frame, true, true, 0)

vbox = Gtk::VBox.new(false, 0)
vbox.border_width = 5
frame.add(vbox)

hbox = Gtk::HBox.new(false, 0)
vbox.pack_start(hbox, false, true, 5)

vbox2 = Gtk::VBox.new(false, 0)
hbox.pack_start(vbox2, true, true, 5)

label = Gtk::Label.new("Value :")
label.set_alignment(0, 0.5)
vbox2.pack_start(label, false, true, 0)

adj = Gtk::Adjustment.new(0.0, -10000.0, 10000.0, 0.5, 100.0, 0.0)

spinner1 = Gtk::SpinButton.new(adj, 1.0, 2)
spinner.wrap = true
spinner.set_size_request(100, -1)
vbox2.pack_start(spinner1, false, true, 0)

vbox2 = Gtk::VBox.new(false, 0)
hbox.pack_start(vbox2, true, true, 5)

label = Gtk::Label.new("Digits :")
label.set_alignment(0, 0.5)
vbox2.pack_start(label, false, true, 0)

adj = Gtk::Adjustment.new(2, 1, 5, 1, 1, 0)
spinner2 = Gtk::SpinButton.new(adj, 0.0, 0)
spinner2.wrap = true
spinner2.signal_connect("value_changed") do |w|
	spinner1.digits = w.value
end
vbox2.pack_start(spinner2, false, true, 0)

hbox = Gtk::HBox.new(false, 0)
vbox.pack_start(hbox, false, true, 5)

button = Gtk::CheckButton.new("Snap to 0.5-ticks")
button.signal_connect("clicked") do |w|
	spinner1.snap_to_ticks = w.active?
end
vbox.pack_start(button, true, true, 0)
button.active = true

button = Gtk::CheckButton.new("Numeric only input mode")
button.signal_connect("clicked") do |w|
	spinner1.numeric = w.active?
end
vbox.pack_start(button, true, true, 0)
button.active = true

val_label = Gtk::Label.new 

hbox = Gtk::HBox.new(false, 0)
vbox.pack_start(hbox, false, true, 5)
button = Gtk::Button.new("Value as Int")
button.signal_connect("clicked") do
	get_value(spinner1, val_label, :Int)
end
hbox.pack_start(button, true, true, 5)

button = Gtk::Button.new("Value as Float")
button.signal_connect("clicked") do
	get_value(spinner1, val_label, :Float)
end
hbox.pack_start(button, true, true, 5)

vbox.pack_start(val_label, true, true, 0)
val_label.set_text("0")

hbox = Gtk::HBox.new(false, 0)
main_vbox.pack_start(hbox, false, true, 0)

button = Gtk::Button.new("Close")
button.signal_connect("clicked") {window.destroy}
hbox.pack_start(button, true, true, 5)

window.show_all
Gtk.main
更新日時:2006/07/02 14:33:53
キーワード:
参照:[gtk2-tut]