У меня есть функция, которая представляет пользователю поле со списком.
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?

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