From: Kazunori Akaishi Date: 1999-07-02T14:04:22+09:00 Subject: [ruby-list:15196] Re: Gtk::Menu の使い方に関する質問 akaishi です。 From: Hiroshi Igarashi Subject: [ruby-list:15195] Re: Gtk::Menu の使い方に関する質問 Date: Fri, 2 Jul 1999 13:42:20 +0900 > > しかしTEST ボタンを押すとき、目に見えているのはメニューではなくてオプショ > > ンメニュー(のみ)です。そしてどうやらラベルはメニューアイテムではなく(一 > > 時的に)オプションメニューに親がすげかえられている(?)ようです。 > > このへん、私も昨晩GTK+のソースを見て確認しました。 > 一瞬Ruby/GTKのバグかと思いましたが、そうではないようです。 > #GTK+にNULLが渡ってしまうのはやっぱりバグか。 MenuItem の child がとれないことの説明は上記で良いとして、 > 宮木さんのスクリプトを上記のように書き換えた場合、 > opt.childrenは要素数1のArray [false]を返します。 > これは変ですね。Ruby/GTKのバグかもしれません。調べてみます。 自分のところでは動いているのになんでやー、と思って調べたところ、事前に MenuItem の child を参照しているかしていないかで挙動が異なるようです。 例えば、 ['Item1','Item2','Item3'].each{|text| menuitem = Gtk::MenuItem.new(text) menuitem.child # この行を追加 menu.append menuitem menuitem.show } このようにしてやると、opt.children がちゃんと参照できます。 # Gtk+ の中で何らかの最適化機構が働いているのかも。 念のためこちらで動作確認したプログラムを添付します。 --------------------------------------------------------------------------- require 'gtk' win = Gtk::Window.new(Gtk::WINDOW_TOPLEVEL) menu = Gtk::Menu.new menu.show vbox = Gtk::VBox.new(false, 0) vbox.show ['Item1','Item2','Item3'].each{|text| menuitem = Gtk::MenuItem.new(text) menuitem.child menu.append menuitem menuitem.show } opt = Gtk::OptionMenu.new opt.set_menu menu opt.show vbox.pack_start opt, false, false, 10 bt = Gtk::Button.new("TEST") bt.signal_connect('clicked'){ puts opt, opt.children[0].get } bt.show vbox.pack_start bt, false, false, 10 win.add vbox win.show Gtk.main