Ruby/GTKのメモ

HOME > それいけ Ruby > GUI
Last modified: Fri Oct 31 10:54:03 +0900 2008

Gtk::Combo

コンボボックスのドロップダウンメニューに項目を設定するには 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(&quot;OK&quot;)
  ok_button.signal_connect(&quot;clicked&quot;) do
    res = entry.get_text
    dialog.destroy
  end
  dialog.action_area.add(ok_button)

  cancel_button = Gtk::Button.new(&quot;Cancel&quot;)
  cancel_button.signal_connect(&quot;clicked&quot;) 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 # =&gt;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(&quot;OK&quot;)
  ok_button.signal_connect(&quot;clicked&quot;) do
    res = entry.get_text
    Gtk.main_quit
  end
  dialog.action_area.add(ok_button)

  cancel_button = Gtk::Button.new(&quot;Cancel&quot;)
  cancel_button.signal_connect(&quot;clicked&quot;) 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