ruby-****@lists*****
ruby-****@lists*****
2003年 5月 26日 (月) 22:46:04 JST
------------------------- REMOTE_ADDR = 210.249.193.205 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/?%A5%DC%A5%BF%A5%F3 ------------------------- ------------------------- = ボタン == 基本的な使い方 require 'gtk2' Gtk.init button = Gtk::Button.new("button") button.signal_connect("clicked") do p "button is clicked." end window = Gtk::Window.new window.set_default_size(100,100) window.add(button) window.show_all Gtk.main --- Gtk::Button.new(label = nil) ボタンウィジェットを生成します。 * label - ボタン上に表示するラベル --- "clicked" ボタンクリック時のシグナルです。 == デフォルトボタンを指定する デフォルトボタンとは、特に選択せずにもEnterキーを押すだけでそのボタンがクリックされるようなボタンのことを言います、つーか初期表示時に選択されているボタンってことかな、たぶん。 で、Ruby/GTKではウィジェットに対し、Gtk::Object#set_flags(Gtk::Widget::CAN_DEFAULT)とした上で、Gtk::Widget#grab_default()とします。 #この機能自体はGtk::Widgetの機能ですので別にGtk::Buttonでなくても使えます。 #でも、使い方が思いつかない....(^^;) require 'gtk2' Gtk.init button1 = Gtk::Button.new("button1") button1.signal_connect("clicked") do p "button1 is clicked." end button1.set_flags(Gtk::Widget::CAN_DEFAULT) #button1.grab_default #(1) button2 = Gtk::Button.new("button2") button2.signal_connect("clicked") do p "button2 is clicked." end button2.set_flags(Gtk::Widget::CAN_DEFAULT) vbox = Gtk::VBox.new vbox.pack_start(button1,true, true, 10) vbox.pack_start(button2,true, true, 10) #button1.grab_default #(2) window = Gtk::Window.new window.set_default_size(300,300) window.add(vbox) button1.grab_default window.show_all Gtk.main --- Gtk::Object#flags=(flag) --- Gtk::Object#set_flags(flag) オブジェクトに対しフラグをセットします。 * flag - この場合はGtk::Widget::CAN_DEFAULTを指定します。 --- Gtk::Widget#grab_default デフォルトボタンに指定します。 このGtk::Widget#grab_default()の位置が要注意です。(1),(2)などに書いてもうまく表示できません。 どうやら、一番親のウインドウにウィジェットがGtk::Container#add()された後でないと反映されないようです。 #私はこれではまりました(T_T)。 == ボタンの枠(レリーフ)を操作する ボタンの枠(レリーフ)を操作してみます。英語の発音的にはリリーフが正しい?ま、どっちでもイイや(^^;)。 require 'gtk2' Gtk.init button = Gtk::Button.new("HELLO") button.set_relief(Gtk::RELIEF_NONE) p button.relief window = Gtk::Window.new window.set_default_size(100,100) window.add(button) window.show_all Gtk.main --- Gtk::Button#relief=(relief) --- Gtk::Button#set_relief(relief) レリーフを指定します。 * relief - レリーフ * Gtk::RELIEF_NORMAL - 通常の枠 * Gtk::RELIEF_HALF - 半分 * Gtk::RELIEF_NONE - なし --- Gtk::Button#relief レリーフ値を返します。 == ボタンのシグナル ボタンのシグナルを使ってみます。 require 'gtk2' Gtk.init button = Gtk::Button.new("button") button.signal_connect("activate") do p "button is activate" end button.signal_connect("clicked") do p "button is clicked." end button.signal_connect("pressed") do p "button is pressed." end button.signal_connect("released") do p "button is released." end button.signal_connect("enter") do p "button is entered." end button.signal_connect("leave") do p "button is leaved." end window = Gtk::Window.new window.set_default_size(100,100) window.add(button) window.show_all Gtk.main 1つのボタンに以下の5つのシグナルを接続できます。 * "activate" - リターンキーを押した時 * "clicked" - クリックとはボタンを押されて(PRESSED)離された(RELEASED)時 * "pressed" - ボタンが押された時 * "released" - ボタンが離された時 * "enter" - ボタンの描画領域にマウスが入った時 * "leave" - ボタンの描画領域からマウスが離れた時 == ボタンを操作するメソッド 実際にマウスでクリックしなくても、指定したボタンに対してイベントを発生させることができます。ここでは、buttonのイベントを他のボタンをクリックすることで発生させてみます。 require 'gtk2' Gtk.init button = Gtk::Button.new("button") button.signal_connect("clicked") do |v| p "button is clicked." end button.signal_connect("pressed") do p "button is pressed." end button.signal_connect("released") do p "button is released." end button.signal_connect("enter") do p "button is entered." end button.signal_connect("leave") do p "button is leaved." end button2 = Gtk::Button.new("button2:clicked") button2.signal_connect("clicked") do p "button2" button.clicked end button3 = Gtk::Button.new("button3:pressed") button3.signal_connect("clicked") do p "button3" button.pressed end button4 = Gtk::Button.new("button4:released") button4.signal_connect("clicked") do p "button4" button.released end button5 = Gtk::Button.new("button5:enter") button5.signal_connect("clicked") do p "button5" button.enter end button6 = Gtk::Button.new("button6:leave") button6.signal_connect("clicked") do p "button6" button.leave end vbox = Gtk::VBox.new vbox.pack_start(button) vbox.pack_start(button2) vbox.pack_start(button3) vbox.pack_start(button4) vbox.pack_start(button5) vbox.pack_start(button6) window = Gtk::Window.new window.add(vbox) window.show_all Gtk.main --- Gtk::Button#clicked --- Gtk::Button#pressed --- Gtk::Button#released --- Gtk::Button#enter --- Gtk::Button#leave それぞれ、click時、press時、release時、enter時、leave時のイベントを発生させます。 == スタイル(前景色/背景色)を指定する 前景色/背景色を指定してみます。背景色の情報は、Gtk::Buttonが、前景色(文字色)はGtk::Buttonのchild(Gtk::Label)が管理しているのでそちらに指定します。 require 'gtk2' Gtk.init style = Gtk::Style.new style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0) style.set_bg(Gtk::STATE_NORMAL, 65535, 0, 0) style.set_fg(Gtk::STATE_ACTIVE, 0, 0, 65535) style.set_bg(Gtk::STATE_ACTIVE, 0, 65535, 0) style.set_fg(Gtk::STATE_PRELIGHT, 65535, 0, 0) style.set_bg(Gtk::STATE_PRELIGHT, 0, 0, 65535) style.set_fg(Gtk::STATE_SELECTED, 65535, 65535, 0) style.set_bg(Gtk::STATE_SELECTED, 0, 65535, 65535) style.set_fg(Gtk::STATE_INSENSITIVE, 65535, 65535, 65535) style.set_bg(Gtk::STATE_INSENSITIVE, 0, 0, 0) button = Gtk::Button.new("Hello World") button.set_style(style) button.child.set_style(style) button2 = Gtk::Button.new("Insensitive") button2.set_style(style) button2.child.set_style(style) button2.set_sensitive(false) window = Gtk::Window.new window.add(Gtk::VBox.new.add(button).add(button2)) window.show_all Gtk.main --- Gtk::Style.new スタイルを生成します。 --- Gtk::Style#set_fg(state, r, g, b) --- Gtk::Style#set_bg(state, r, g, b) スタイルに前景色・背景色を指定します。 * state - そのボタンが何の状態の時に色を指定するか * Gtk::STATE_NOMRMAL - 通常時 * Gtk::STATE_ACTIVE - ボタンが凹んだ時 * Gtk::STATE_PRELIGHT - マウスがウィジェット上になった時 * Gtk::STATE_SELECTED - アイテムが選択された時(ここでは特に何も起きません) * Gtk::STATE_INSENSITIVE - ボタンが使用不可の状態の時 * r, g, b - 赤・緑・青(0 - 65535) --- Gtk::Widget#set_style(style) スタイルを設定します。 * style - スタイル(Gtk::Style) --- Gtk::Bin#child 子供のウィジェットを返します。Gtk::Buttonの場合はGtk::Labelになります。 --- Gtk::Widget#set_sensitive(sensitive) ボタンの使用可・不可を設定します。 * sensitive - true:使用可、false:使用不可 == 画像つきボタンを作る Gtk::ButtonはGtk::Binのサブクラスです。したがって、Gtk::Buttonに1つだけ子ウィジェットを追加することができます。1つだけと言っても、それを他のコンテナウィジェットにしてしまえば後はやりたい放題です(^^;)。 そこで、ここではGtk::VBoxを使って上下に画像・ラベルを付けたボタンを作ってみます。 XPM形式のファイルは何でも良いのですが、一応、この例題で使ったものを((<r.xpm|URL:r.xpm>))に置いておきます。 require 'gtk2' Gtk.init window = Gtk::Window.new vbox = Gtk::VBox.new vbox.pack_start(Gtk::Image.new("r.xpm")) vbox.pack_start(Gtk::Label.new("test")) button = Gtk::Button.new button.add(vbox) window.add(button) window.show_all Gtk.main