ruby-****@lists*****
ruby-****@lists*****
2003年 6月 25日 (水) 00:52:37 JST
------------------------- REMOTE_ADDR = 61.26.70.211 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/?%A5%E9%A5%D9%A5%EB ------------------------- = ラベル ラベルはGTKではよく使われるウィジェットで比較的単純なものである. ラベルは対応するXのウィンドウを持たないのでシグナルを発行しない. もしシグナルを拾ったり,あるいはクリッピングを行いたければ((<イベントボックスウィジェット>))か((<ボタンウィジェット>))の中にラベルを配置しよう. == 新規にラベルを作成する Gtk::Label.new(str, use_underline = nil) {{image_right "label1.png"}} 第一引数はラベルに表示したい文字列である. 第二引数がtrueの場合,str中の'_'は次の文字の下線として表示される. '_'自身を表示したい場合は'__'のように'_'を続けて2つ書けばよい. % irb irb(main):001:0> require 'gtk2' => true irb(main):002:0> Gtk::init => Gtk irb(main):003:0> l = Gtk::Label.new("_under_line") => #<Gtk::Label:0x0a29a070 ptr=0x0a351338> irb(main):004:0> w = Gtk::Window.new.add(l).show_all => #<Gtk::Window:0x0a296848 ptr=0x0a356f80> irb(main):005:0> w.signal_connect("destroy") {Gtk::main_quit} => #<Gtk::Window:0x0a296848 ptr=0x0a356f80> irb(main):006:0> Thread.start {Gtk::main} => #<Thread:0xa2938c0 run> == 下線による装飾 下線による装飾を使用するかどうかは,次のメソッドで指定することもできる. Gtk::Label#set_use_underline(underline) Gtk::Label#use_underline=(underline) {{image_right "label2.png"}} もちろん現在の状態はGtk::Label#underline?で取得できる. irb(main):007:0> l.use_underline? => false irb(main):008:0> l.use_underline = true => true irb(main):009:0> l.use_underline? => true == ラベルテキストの変更 ラベル作成後にテキストを変更するには次のメソッドを使う: Gtk::Label#set_text(str) 引数には新しい文字列を指定する. 新しい文字列を表示するのに必要なスペースは必要なら自動的に調整される. ラベルの文字列中に改行を入れることで複数行のラベルを作成できる. {{image_right "label3.png"}} 現在ラベルに設定されている文字列を取得するにはGtk::Label#textを用いる. irb(main):010:0> l.text => "underline" irb(main):011:0> l.use_underline = false => false irb(main):012:0> l.text => "_under_line" ← use_underlineの状態で得られるテキストが違う irb(main):013:0> l.set_text("multi-line label\nby line\nbreaks") => #<Gtk::Label:0x0a29a070 ptr=0x0a351338> == 表示位置の変更 ラベルのテキストは次のメソッドを使って位置を調整できる. Gtk::Label#set_justify(jtype) Gtk::Label#justify=(jtype) jtypeで指定できる値は Gtk::JUSTIFY_LEFT Gtk::JUSTIFY_RIGHT Gtk::JUSTIFY_CENTER (デフォルト) Gtk::JUSTIFY_FILL {{image_right "image4.png"}} の4種類の定数である((-Gtk::JUSTIFY_FILLがうまくいかない…-)). irb(main):014:0> l.justify = Gtk::JUSTIFY_CENTER => 2 == 下線による装飾(その2) Gtk::Label#set_pattern(pattern) Gtk::Label#pattern=(pattern) pattern引数はアンダースコア文字とスペース文字から成り,下線をどのように引くかを指定する. アンダースコアはラベルテキスト中の同じ位置の文字に下線を引くことを表す. 例えば文字列 "__ __" {{image_right "label5.png"}} は最初の2文字と8番目と9番目の文字に下線を引く. irb(main):015:0> l.pattern = "_ " * (l.text.length + 1 / 2) => "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " もし単に下線付きアクセラレータ(ニーモニック)をラベル中で使いたければ,Gtk::Label#set_patternではなくGtk::Label.newの第二引数にtrueを指定するかGtk::Label#set_use_underlineを使用するべきである. == テキストの自動折り返し {{image_right "label6.png"}} さらに,ラベルウィジェットにはテキストの行を自動的に折り返す機能もある. この機能を有効にするには次のメソッドを使用する: Gtk::Label#set_line_wrap(wrap) Gtk::Label#line_wrap=(wrap) wrap引数にはtrue(折り返しする)またはfalse(折り返ししない)を指定する. % irb irb(main):001:0> require 'gtk2' => true irb(main):002:0> Gtk::init => Gtk irb(main):003:0> l = Gtk::Label.new("Ruby-GNOME2 is a set of Ruby language bind ings for the GNOME 2.0 development environment. This is the next generation of Ruby-GNOME.") => #<Gtk::Label:0x0a2967e8 ptr=0x0a350a78> irb(main):004:0> l.wrap = true => true irb(main):005:0> Gtk::Window.new.add(l).show_all => #<Gtk::Window:0x0a2883e8 ptr=0x0a35f190> irb(main):006:0> Thread.start {Gtk::main} => #<Thread:0xa285460 run> ((*ここから下は古い.*)) = ラベル ((*まだRuby/GTK向けのものです。*)) == 基本的な使い方 require 'gtk2' Gtk.init label = Gtk::Label.new("Hello World") window = Gtk::Window.new window.add(label) window.show_all Gtk.main == テキストを後から設定する Gtk::Label.new時ではなく、生成後にGtk::Labelに文字列を指定することもできます(当たり前か(^^;))。 require 'gtk2' Gtk.init label = Gtk::Label.new("Hello") text = label.text label.set_text(text + " World") window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#text 現在Gtk::Labelに指定されている文字列を取得します。 --- Gtk::Label#set_text(text) textにテキストを指定します。 == スタイル(前景色/背景色/フォント)を指定する 前景色/フォントを変更するにはGtk::Labelに対してGtk::Widget#set_style()すれば良いのですが、背景色は直接Gtk::Labelに対して指定できません。そのため、ここではGtk::Labelの親ウィジェットにGtk::EventBoxを使って、Gtk::EventBoxに対して色をつけます。 require 'gtk2' Gtk.init style = Gtk::Style.new style.set_font(Gdk::Font.fontset_load("-adobe-helvetica-bold-r-normal--24-*")) style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0) style.set_bg(Gtk::STATE_NORMAL, 65535, 0, 0) label = Gtk::Label.new("Hello World") label.set_style(style) eventbox = Gtk::EventBox.new eventbox.set_style(style) eventbox.add(label) window = Gtk::Window.new window.add(eventbox) window.show_all Gtk.main Gtk::Labelは backgroundの色を保持する Gdk::Windowを持っていないので、Gtk::Widget#set_style()しても色が見えないというわけです。 == スタイル(前景色/背景色/フォント)を指定する2 2では独自にstyleを生成(Gtk::Style.new())しましたが、以下のようにGtk::Widget#get_style()を用いて既存のウィジェットからスタイルを取り出してそれを変更するということもできます。 なんとなくこっちの方が確実な感じがするのですが、いかがでしょう? require 'gtk2' Gtk.init window = Gtk::Window.new style = window.get_style style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0) label = Gtk::Label.new("Hello World") label.set_style(style) window.add(label) window.show_all Gtk.main ※ 日本語の場合、Gtk::Style#set_font(font)を使ってフォントの指定をしないと文字化けするようです。なんでだろ。もうちょっと調べますか...。 == 2行以上の表示と右寄せ/左寄せ/中央寄せ 2行以上表示する場合は単に指定文字列に\nを入れればOKです。ここでは、Gtk::Label#set_justify()を使って右寄せにしています。 require 'gtk2' label = Gtk::Label.new("first line\nsecond line\nhoge fuga uge ugyo") label.set_justify(Gtk::JUSTIFY_RIGHT) window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#set_justify(type) * Gtk::JUSTIFY_LEFT - 左寄せ * Gtk::JUSTIFY_RIGHT - 右寄せ * Gtk::JUSTIFY_CENTER - 中央寄せ(デフォルト) * Gtk::JUSTIFY_FILL - ?(イメージ的には単語毎かなんかにスペースを入れてくれそうなんだけど....) Gtk::Label#set_justify()はLabel自体、2行以上指定しないと意味がないみたいです。Labelの幅より小さい文字列を指定した場合は1行でも調節されると思っていたんですが...。 == 行末で折り返す Gtk::LabelにはテキストがGtk::Label自体の幅より大きくなってしまった場合に、単語毎に自動的に改行してくれるLine(Word) wrap機能があります。 require 'gtk2' Gtk.init label = Gtk::Label.new("hoge fuga uge ugyo hoge fuga uge ugyo hoge fuga uge") label.set_line_wrap(true) window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#set_line_wrap(line_wrap) * line_wrap - Line wrapする場合はtrue、しない場合はfalseを設定します。 == アンダーラインを引く Gtk::Label#set_pattern()をするとアンダーラインを指定することができます。 require 'gtk2' label = Gtk::Label.new("hoge fuga\nuge") #label.set_line_wrap(true) label.set_pattern("____ ____ ___") window = Gtk::Window.new window.add(label) window.show_all Gtk.main なんか、Gtk::Label#set_line_wrap(true)と一緒には使えないみたいです。上記例でlabel.set_line_wrap(true)のコメントを外すとアンダーラインが表示されなくなります。 == メニューバーで使うようにアンダーラインを引く Gtk::ItemFactoryのアクセラレータキーの指定方法と同様の方法でアンダーラインを引くこともできます。ただし、この方法はGTK+の内部で使われることを意図して作られたメソッドですので、使うことはほとんどないでしょう。 require 'gtk2' label = Gtk::Label.new("") p label.parse_uline("_Files") window = Gtk::Window.new window.add(label) window.show_all Gtk.main Gtk::Label#parse_uline(text)の戻り値はアンダースコアの次の1字を小文字にした場合のキー値になります。例えば、上記例(_Files)ではfのキー値です。 ------------------------- = ラベル ラベルはGTKではよく使われるウィジェットで比較的単純なものである. ラベルは対応するXのウィンドウを持たないのでシグナルを発行しない. もしシグナルを拾ったり,あるいはクリッピングを行いたければ((<イベントボックスウィジェット>))か((<ボタンウィジェット>))の中にラベルを配置しよう. == 新規にラベルを作成する Gtk::Label.new(str, use_underline = nil) {{image_right "label1.png"}} 第一引数はラベルに表示したい文字列である. 第二引数がtrueの場合,str中の'_'は次の文字の下線として表示される. '_'自身を表示したい場合は'__'のように'_'を続けて2つ書けばよい. % irb irb(main):001:0> require 'gtk2' => true irb(main):002:0> Gtk::init => Gtk irb(main):003:0> l = Gtk::Label.new("_under_line") => #<Gtk::Label:0x0a29a070 ptr=0x0a351338> irb(main):004:0> w = Gtk::Window.new.add(l).show_all => #<Gtk::Window:0x0a296848 ptr=0x0a356f80> irb(main):005:0> w.signal_connect("destroy") {Gtk::main_quit} => #<Gtk::Window:0x0a296848 ptr=0x0a356f80> irb(main):006:0> Thread.start {Gtk::main} => #<Thread:0xa2938c0 run> == 下線による装飾 下線による装飾を使用するかどうかは,次のメソッドで指定することもできる. Gtk::Label#set_use_underline(underline) Gtk::Label#use_underline=(underline) {{image_right "label2.png"}} もちろん現在の状態はGtk::Label#underline?で取得できる. irb(main):007:0> l.use_underline? => false irb(main):008:0> l.use_underline = true => true irb(main):009:0> l.use_underline? => true == ラベルテキストの変更 ラベル作成後にテキストを変更するには次のメソッドを使う: Gtk::Label#set_text(str) 引数には新しい文字列を指定する. 新しい文字列を表示するのに必要なスペースは必要なら自動的に調整される. ラベルの文字列中に改行を入れることで複数行のラベルを作成できる. {{image_right "label3.png"}} 現在ラベルに設定されている文字列を取得するにはGtk::Label#textを用いる. irb(main):010:0> l.text => "underline" irb(main):011:0> l.use_underline = false => false irb(main):012:0> l.text => "_under_line" ← use_underlineの状態で得られるテキストが違う irb(main):013:0> l.set_text("multi-line label\nby line\nbreaks") => #<Gtk::Label:0x0a29a070 ptr=0x0a351338> == 表示位置の変更 ラベルのテキストは次のメソッドを使って位置を調整できる. Gtk::Label#set_justify(jtype) Gtk::Label#justify=(jtype) jtypeで指定できる値は Gtk::JUSTIFY_LEFT Gtk::JUSTIFY_RIGHT Gtk::JUSTIFY_CENTER (デフォルト) Gtk::JUSTIFY_FILL {{image_right "image4.png"}} の4種類の定数である((-Gtk::JUSTIFY_FILLがうまくいかない…-)). irb(main):014:0> l.justify = Gtk::JUSTIFY_CENTER => 2 == 下線による装飾(その2) Gtk::Label#set_pattern(pattern) Gtk::Label#pattern=(pattern) pattern引数はアンダースコア文字とスペース文字から成り,下線をどのように引くかを指定する. アンダースコアはラベルテキスト中の同じ位置の文字に下線を引くことを表す. 例えば文字列 "__ __" {{image_right "label5.png"}} は最初の2文字と8番目と9番目の文字に下線を引く. irb(main):015:0> l.pattern = "_ " * (l.text.length + 1 / 2) => "_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ " もし単に下線付きアクセラレータ(ニーモニック)をラベル中で使いたければ,Gtk::Label#set_patternではなくGtk::Label.newの第二引数にtrueを指定するかGtk::Label#set_use_underlineを使用するべきである. == テキストの自動折り返し {{image_right "label6.png"}} さらに,ラベルウィジェットにはテキストの行を自動的に折り返す機能もある. この機能を有効にするには次のメソッドを使用する: Gtk::Label#set_line_wrap(wrap) Gtk::Label#line_wrap=(wrap) wrap引数にはtrue(折り返しする)またはfalse(折り返ししない)を指定する. % irb irb(main):001:0> require 'gtk2' => true irb(main):002:0> Gtk::init => Gtk irb(main):003:0> l = Gtk::Label.new("Ruby-GNOME2 is a set of Ruby language bind ings for the GNOME 2.0 development environment. This is the next generation of Ruby-GNOME.") => #<Gtk::Label:0x0a2967e8 ptr=0x0a350a78> irb(main):004:0> l.wrap = true => true irb(main):005:0> Gtk::Window.new.add(l).show_all => #<Gtk::Window:0x0a2883e8 ptr=0x0a35f190> irb(main):006:0> Thread.start {Gtk::main} => #<Thread:0xa285460 run> ((*ここから下は古い.*)) = ラベル ((*まだRuby/GTK向けのものです。*)) == 基本的な使い方 require 'gtk2' Gtk.init label = Gtk::Label.new("Hello World") window = Gtk::Window.new window.add(label) window.show_all Gtk.main == テキストを後から設定する Gtk::Label.new時ではなく、生成後にGtk::Labelに文字列を指定することもできます(当たり前か(^^;))。 require 'gtk2' Gtk.init label = Gtk::Label.new("Hello") text = label.text label.set_text(text + " World") window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#text 現在Gtk::Labelに指定されている文字列を取得します。 --- Gtk::Label#set_text(text) textにテキストを指定します。 == スタイル(前景色/背景色/フォント)を指定する 前景色/フォントを変更するにはGtk::Labelに対してGtk::Widget#set_style()すれば良いのですが、背景色は直接Gtk::Labelに対して指定できません。そのため、ここではGtk::Labelの親ウィジェットにGtk::EventBoxを使って、Gtk::EventBoxに対して色をつけます。 require 'gtk2' Gtk.init style = Gtk::Style.new style.set_font(Gdk::Font.fontset_load("-adobe-helvetica-bold-r-normal--24-*")) style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0) style.set_bg(Gtk::STATE_NORMAL, 65535, 0, 0) label = Gtk::Label.new("Hello World") label.set_style(style) eventbox = Gtk::EventBox.new eventbox.set_style(style) eventbox.add(label) window = Gtk::Window.new window.add(eventbox) window.show_all Gtk.main Gtk::Labelは backgroundの色を保持する Gdk::Windowを持っていないので、Gtk::Widget#set_style()しても色が見えないというわけです。 == スタイル(前景色/背景色/フォント)を指定する2 2では独自にstyleを生成(Gtk::Style.new())しましたが、以下のようにGtk::Widget#get_style()を用いて既存のウィジェットからスタイルを取り出してそれを変更するということもできます。 なんとなくこっちの方が確実な感じがするのですが、いかがでしょう? require 'gtk2' Gtk.init window = Gtk::Window.new style = window.get_style style.set_fg(Gtk::STATE_NORMAL, 0, 65535, 0) label = Gtk::Label.new("Hello World") label.set_style(style) window.add(label) window.show_all Gtk.main ※ 日本語の場合、Gtk::Style#set_font(font)を使ってフォントの指定をしないと文字化けするようです。なんでだろ。もうちょっと調べますか...。 == 2行以上の表示と右寄せ/左寄せ/中央寄せ 2行以上表示する場合は単に指定文字列に\nを入れればOKです。ここでは、Gtk::Label#set_justify()を使って右寄せにしています。 require 'gtk2' label = Gtk::Label.new("first line\nsecond line\nhoge fuga uge ugyo") label.set_justify(Gtk::JUSTIFY_RIGHT) window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#set_justify(type) * Gtk::JUSTIFY_LEFT - 左寄せ * Gtk::JUSTIFY_RIGHT - 右寄せ * Gtk::JUSTIFY_CENTER - 中央寄せ(デフォルト) * Gtk::JUSTIFY_FILL - ?(イメージ的には単語毎かなんかにスペースを入れてくれそうなんだけど....) Gtk::Label#set_justify()はLabel自体、2行以上指定しないと意味がないみたいです。Labelの幅より小さい文字列を指定した場合は1行でも調節されると思っていたんですが...。 == 行末で折り返す Gtk::LabelにはテキストがGtk::Label自体の幅より大きくなってしまった場合に、単語毎に自動的に改行してくれるLine(Word) wrap機能があります。 require 'gtk2' Gtk.init label = Gtk::Label.new("hoge fuga uge ugyo hoge fuga uge ugyo hoge fuga uge") label.set_line_wrap(true) window = Gtk::Window.new window.add(label) window.show_all Gtk.main --- Gtk::Label#set_line_wrap(line_wrap) * line_wrap - Line wrapする場合はtrue、しない場合はfalseを設定します。 == アンダーラインを引く Gtk::Label#set_pattern()をするとアンダーラインを指定することができます。 require 'gtk2' label = Gtk::Label.new("hoge fuga\nuge") #label.set_line_wrap(true) label.set_pattern("____ ____ ___") window = Gtk::Window.new window.add(label) window.show_all Gtk.main なんか、Gtk::Label#set_line_wrap(true)と一緒には使えないみたいです。上記例でlabel.set_line_wrap(true)のコメントを外すとアンダーラインが表示されなくなります。 == メニューバーで使うようにアンダーラインを引く Gtk::ItemFactoryのアクセラレータキーの指定方法と同様の方法でアンダーラインを引くこともできます。ただし、この方法はGTK+の内部で使われることを意図して作られたメソッドですので、使うことはほとんどないでしょう。 require 'gtk2' label = Gtk::Label.new("") p label.parse_uline("_Files") window = Gtk::Window.new window.add(label) window.show_all Gtk.main Gtk::Label#parse_uline(text)の戻り値はアンダースコアの次の1字を小文字にした場合のキー値になります。例えば、上記例(_Files)ではfのキー値です。