Ruby (Shoes) - Подождите, пока функция вернет значение

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

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 ждать ввода из поля со списком, а затем выполнять остальную часть кода.

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

interface =  ask("write your interface here")

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

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
0
2 852
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне потребовалось время, чтобы понять ваш вопрос :) Я начал писать длинный ответ обо всей теории приложений с графическим интерфейсом. Но у вас уже есть все необходимое. Блок, который принимает 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 Модуль наблюдателя. Надеюсь, это помогло.

Другие вопросы по теме