ruby-****@sourc*****
ruby-****@sourc*****
2003年 8月 17日 (日) 00:17:45 JST
------------------------- REMOTE_ADDR = 61.26.70.211 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/?tut-gtk-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#numetic=(numeric) Gtk::SpinButton#set_numetic(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 {{image_right "spinbutton.png"}} それではいつものようにサンプルを見てみよう. - + {{br}} #! /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 Gtk.init 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