コンボボックスのドロップダウンメニューに項目を設定するには Gtk::Combo#set_popdown_stringsを使うが、項目を追加したい場合は以 下のようにGtk::ListItem#showを忘れずに呼ぶ。show_allだとそこまで は面倒見てくれないようだ。
combo = Gtk::Combo.new combo.set_popdown_string(%w(hoge fuga)) %w(foo bar baz).each do |label| li = Gtk::ListItem.new(label) combo.list.add(li) li.show # <- これを忘れると追加されているように見えない end
普通にダイアログボックスをnewしてshowしても、ダイアログボックス がdestroyされるのを待たずに処理が実行されるので思いどおりにいかない。
def ask_with_dialog
res = nil
dialog = Gtk::Dialog.new
entry = Gtk::Entry.new
dialog.vbox.add(entry)
ok_button = Gtk::Button.new("OK")
ok_button.signal_connect("clicked") do
res = entry.get_text
dialog.destroy
end
dialog.action_area.add(ok_button)
cancel_button = Gtk::Button.new("Cancel")
cancel_button.signal_connect("clicked") do
dialog.destory
end
dialog.action_area.add(cancel_button)
dialog.set_modal(true)
dialog.show_all
# OK、Cancelボタンが押されなくても処理は継続されるので
# ボタンが押される前にresを返す。
# よってよほど早くentryに入力してOKボタンを押さない限り
# nilが返る
res
end
# ここではもうGtk.mainループの中にいるとする
res = ask_with_dialog # =>nil
これはGtk.mainを入れ子にすることによって解決できる。
def ask_with_dialog
res = nil
dialog = Gtk::Dialog.new
entry = Gtk::Entry.new
dialog.vbox.add(entry)
ok_button = Gtk::Button.new("OK")
ok_button.signal_connect("clicked") do
res = entry.get_text
Gtk.main_quit
end
dialog.action_area.add(ok_button)
cancel_button = Gtk::Button.new("Cancel")
cancel_button.signal_connect("clicked") do
Gtk.main_quit
end
dialog.action_area.add(cancel_button)
dialog.set_modal(true)
dialog.show_all
# ここで以降の処理が待たされるので
# OKボタンが押されるとentryに入力された値が返る
Gtk.main
dialog.destory
res
end