Ruby (Shoes) - дождаться, пока функция вернет значение - PullRequest
2 голосов
/ 19 декабря 2008

У меня есть функция, которая представляет пользователю поле со списком.

def select_interface(interfaces)
  list_box :items => interfaces do |list|
    interface = list.text
  end
  ### ideally should wait until interface has a value then: ###
  return interface
end

Остальная часть программы зависит от выбора из этого поля со списком.

Я хотел бы найти способ заставить ruby ​​ждать ввода из поля со списком, а затем выполнять выполнение остальной части кода.

В shoes есть аналогичная функция ask , которая будет ожидать ввода пользователя.

interface =  ask("write your interface here")

Как я могу реализовать эту функцию "дождаться, пока переменная будет иметь значение" в Ruby / shoes?

1 Ответ

2 голосов
/ 22 декабря 2008

Мне потребовалось некоторое время, чтобы понять ваш вопрос :) Я начал писать длинный ответ обо всей теории приложений с графическим интерфейсом. Но у вас уже есть все, что вам нужно. Блок, который принимает list_box , на самом деле является его методом изменения. Вы говорите, что делать, когда это меняется. Просто отложите запуск остальной части программы, когда получите нужное значение.

Shoes.app do 
  interfaces = ["blah", "blah1", "blah2"]
  # proc is also called lambda
  @run_rest_of_application = proc do
    if @interface == "blah"
      do_blah
    # etc
  end

  @list_box = list_box(:items => interfaces) do |list|
    @interface = list.text
    @run_rest_of_application.call
    @list_box.hide # Maybe you only wanted this one time?
  end
end

Это основная идея всех приложений с графическим интерфейсом: создайте начальное приложение, затем дождитесь «событий», которые создадут новые состояния, на которые вы отвечаете. Например, в ruby-gnome2 вы бы использовали функцию / блок обратного вызова с Gtk :: ComboBox , который изменил бы состояние вашего приложения. Примерно так:

# Let's say you're in a method in a class
@interface = nil
@combobox.signal_connect("changed") do |widget| 
  @interface = widget.selection.selected
  rebuild_using_interface
end

Даже вне инструментария вы можете получить «бесплатную» систему событий, используя модуль наблюдателя Ruby . Надеюсь, это помогло.

...