2008-12-19 97 views
2

我有一個向用戶顯示組合框的函數。Ruby(鞋子) - 等待函數返回值

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 

該程序的其餘部分取決於從該組合框中的選擇。

我想找到一種方法讓紅寶石等待來自組合框的輸入,然後執行其餘的代碼。

shoes中有一個類似的功能,叫做ask等待用戶的輸入。

interface = ask("write your interface here") 

我該如何在Ruby/shoes中實現這個「等到變量具有值」函數?

回答

2

我花了一段時間才明白你的問題:)我開始寫關於GUI應用程序的整個理論的長篇答案。但是你已經擁有了你需要的一切。 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 

這背後GUI應用程序的基本思路:構建初始應用程序,然後等待「事件」,爲您迴應,這將創造新的狀態。例如,在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的Observer module得到一個「免費」的活動體系。希望這有助於。

+0

您的解決方案確實工作得很好。 感謝您的幫助! – ischnura 2008-12-28 20:10:23