ruby-****@lists*****
ruby-****@lists*****
2003年 5月 26日 (月) 22:56:06 JST
------------------------- REMOTE_ADDR = 210.249.193.205 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/?%A5%B9%A5%D4%A5%F3%A5%DC%A5%BF%A5%F3 ------------------------- ------------------------- = スピンボタン ((*まだRuby/GTK(1)用です*)) テキスト+値の増減用矢印ボタンからなるウィジェットです。名前はButtonですが実際はGtk::Entryのサブクラスです。 == 基本的な使い方 require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) window = Gtk::Window.new window.set_usize(100,100) window.add(spinbutton) window.show_all Gtk.main Gtk::Adjustmentは範囲を指定するための汎用的な部品で、その使われ方は色々です。Gtk::SpinButtonの場合は以下のように使います。 Gtk::Adjustment.new(value, lower, upper, step_increment, page_increment, page_size) * value - SpinButtonの初期値 * lower - 下限値 * upper - 上限値 * step_increment - マウスボタン1(通常は左ボタン)をクリックした時の増減幅 * page_increment - マウスボタン2(通常は中央ボタン)をクリックした時の増減幅 * page_size - 未使用 Gtk::SpinButton.new(adjustment, climb_rate, digits)は * adjustment - Gtk::Adjustment * climb_rate - ボタンが押され続けたときの値が加速する割合(0〜1)。 * digits - 小数点以下何位まで表示するか というわけで、上記例では、 * 最初に3が表示されて、下限値が2で上限値が100 * マウスボタン1をクリックすると0.001ずつ増減して、マウスボタン2をクリックすると10ずつ増減する * マウスを押しっぱなしにした時に加速する割合は0.2 * 小数点第3位まで表示 という具合になります。 ちなみに、マウスボタン3(通常は右ボタン)をクリックすると下限値・上限値にジャンプします....知らなかった(^^;)。 == 値を設定する 通常、SpinButtonの初期値はGtk::Adujustment.new()のvalueになるのですが、別途、値を設定することもできます。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) button = Gtk::Button.new("click!") button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.set_value(10) end vbox = Gtk::VBox.new vbox.pack_start(spinbutton) vbox.pack_start(button) window = Gtk::Window.new window.set_usize(100,100) window.add(vbox) window.show_all Gtk.main 同様に、他の値も設定できます。 <UL> * Gtk::SpinButton#set_adjustment(adjustment) - Gtk::Adjustment * Gtk::SpinButton#set_digits(digit) - 小数点以下の表示 </UL> == 値を取得する SpinButtonは、整数値として値を取得する場合と、浮動小数点値として取得する場合でメソッドが異なります。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) button = Gtk::Button.new("click!") button.signal_connect(Gtk::Button::SIGNAL_CLICKED) do printf("%d\n", spinbutton.get_value_as_int) printf("%f\n", spinbutton.get_value_as_float) end vbox = Gtk::VBox.new vbox.pack_start(spinbutton) vbox.pack_start(button) window = Gtk::Window.new window.set_usize(100,100) window.add(vbox) window.show_all Gtk.main floatかintかというのを分けて判断するのってなんかちょっと嫌な感じですね。 == 数値のみに入力制限する ユーザがテキスト部分に直接手入力した場合、3までの例では数値でない文字を入れることができてしまいます。これを避けたい場合はGtk::SpinButton#set_numeric()にtrueを設定します。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) spinbutton.set_numeric(true) window = Gtk::Window.new window.set_usize(100,100) window.add(spinbutton) window.show_all Gtk.main なんかデフォルトでtrueで良いような感じもするんですけどね〜。 == 上限値と下限値を連続的につなげる 上矢印をクリックし続けて上限値まで届くと、デフォルトではSpinButtonの動きが止まります。 Gtk::SpinButton#set_wrap()にtrueを設定すると、上限値を超えた場合は下限値へ、下限値を超えた場合は上限値へ連続的に値が変わっていきます。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) spinbutton.set_wrap(true) window = Gtk::Window.new window.set_usize(100,100) window.add(spinbutton) window.show_all Gtk.main == 増減する際に値を丸める これちょっと表現が難しいのですが...。まずは以下の例を実行します。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.5, 2, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) #spinbutton.set_snap_to_ticks(true) #(1) window = Gtk::Window.new window.set_usize(100,100) window.add(spinbutton) window.show_all Gtk.main 実際に実行して、以下の操作を行います。 * 最初に3.000が表示される。 * 一度、上矢印ボタンをクリック(マウスボタン1)する。すると3.500が表示される。 * キーボードから3.521と入力する。 * もう一度、上矢印ボタンをクリック(マウスボタン1)する。すると4.021と表示される。 これのポイントは、矢印ボタンがテキストの値からstep_increment(この場合は0.5)分増減するようになっているという部分です。 次に、(1)のコメント行を有効にしてから同じことをやってみます。すると、3.521→4.000と「丸められ」ることがわかると思います。つまりはそういう機能です(うーん、難解(^^;))。 値は自由に入力させたいけど、増減する場合は丸めたい場合はこれを使うってことでしょうけどあまりうれしくは無いような気がするんだけどなぁ(^^;)。 == アップデートポリシーの変更 これも難しいッス(^^;)。アップデートポリシーは、テキスト上の数値がGtk::Adjustmentで指定された上限値・下限値を超えて入力された場合の動作の違いを指定します。Gtk::SpinButton::GTK_UPDATE_ALWAYS か Gtk::SpinButton::GTK_UPDATE_IF_VALIDの2つがあります。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.5, 2, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) spinbutton.set_update_policy(GTK::SpinButton::UPDATE_IF_VALID) window = Gtk::Window.new window.set_usize(100,100) window.add(spinbutton) window.show_all Gtk.main 上記例だと、下限値2,上限値100,デフォルト値3.000で増減幅0.5です。で、この状態で下限値より小さい値(1)を入力します。 * 1を手入力する。次に下矢印をクリックする。 → 2.500になる(手入力した値は関係なし) * 再び1を手入力し、下矢印をクリックする。 → 2.000になる(こちらも手入力した値は関係なし) * 1を手入力する。次に上矢印をクリックする。 → 2.500になる(手入力した値は関係なし) * 再び1を手入力し、上矢印をクリックする。 → 3.000になる(こちらも手入力した値は関係なし) 同様に上限値より大きい値で確認してもわかるのですが、手入力した情報が範囲を超えていると表示はされるものの内部で保持している値には反映されないということのようです。 これに対し、Gtk::SpinButton::GTK_UPDATE_IF_VALIDのかわりにGtk::SpinButton::GTK_UPDATE_ALWAYSを設定して、上記例を実行すると以下のようになります。 * 1を手入力する。次に下矢印をクリックする。 → 2.000になる(下限値に指定される) * 再び1を手入力し、下矢印をクリックする。 → 2.000になる(こちらも下限値になる) * 1を手入力する。次に上矢印をクリックする。 → 2.500になる(下限値+0.5) * 再び1を手入力し、上矢印をクリックする。 → 2.500になる(こちらも下限値+0.5) こちらは範囲を超えた値を入れると内部的には下限値・上限値が設定されるようです。<RB> ちなみに、デフォルトはGtk::SpinButton::GTK_UPDATE_ALWAYSです。 == Gtk::SpinButton以外からGtk::SpinButtonの値を変更する 別にチカラワザでもできないことはないのですが...。Gtk::SpinButtonの矢印ボタンをクリックせずに値を増減させたりするためにGtk::SpinButton#spin()というメソッドが用意されています。 <PRE CLASS="code"> require 'gtk' adj = Gtk::Adjustment.new(3, 2, 100, 0.001, 10, 0) spinbutton = Gtk::SpinButton.new(adj, 0.2, 3) #マウスボタン1と同じ button1 = Gtk::Button.new("STEP_FORWARD") button1.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::STEP_FORWARD, 3) end button2 = Gtk::Button.new("STEP_BACKWARD") button2.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::STEP_BACKWARD, 3) end #マウスボタン2と同じ button3 = Gtk::Button.new("PAGE_FORWARD") button3.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::PAGE_FORWARD, 0) end button4 = Gtk::Button.new("PAGE_BACKWARD") button4.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::PAGE_BACKWARD, 0) end #マウスボタン3と同じ button5 = Gtk::Button.new("HOME") button5.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::HOME, 0) end button6 = Gtk::Button.new("END") button6.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::END, 0) end #その他 button7 = Gtk::Button.new("USER_DEFINED") button7.signal_connect(Gtk::Button::SIGNAL_CLICKED) do spinbutton.spin(Gtk::SpinButton::USER_DEFINED, -1.5) end vbox = Gtk::VBox.new vbox.pack_start(spinbutton) vbox.pack_start(button1) vbox.pack_start(button2) vbox.pack_start(button3) vbox.pack_start(button4) vbox.pack_start(button5) vbox.pack_start(button6) vbox.pack_start(button7) window = Gtk::Window.new window.set_usize(200,250) window.add(vbox) window.show_all Gtk.main Gtk::SpinButton#spin(direction, value)の結果を以下の一覧表にまとめてみました。 <TABLE BORDER=1 CELLSPACING=0> <TR><TH>direction</TH><TH>内容</TH></TR> <TR> <TD CLASS="code">Gtk::SpinButton::STEP_FORWARD,STEP_BACKWARD</TD> <TD>valueに指定した値が増減分となる。0を指定するとstep_increment値が増減分となる(マウスボタン1相当)。</TD> </TR> <TR> <TD CLASS="code">Gtk::SpinButton::PAGE_FORWARD,PAGE_BACKWARD</TD> <TD>valueに指定した値は無視される(?)。page_increment値が増減分となる(マウスボタン2相当)。</TD> </TR> <TR> <TD CLASS="code">Gtk::SpinButton::HOME,END</TD> <TD>valueに指定した値は無視される。HOMEは下限値に、ENDは上限値になる。page_increment分だけ増減する(マウスボタン3相当)。</TD> </TR> <TR> <TD CLASS="code">Gtk::SpinButton::USER_DEFINED</TD> <TD>valueに指定した値が増加分(負値にすると減少分)となる。</TD> </TR> </TABLE>