2012-01-30 45 views
1

我在嘗試使用list_box從不同類型的轉換中進行選擇。當我啓動程序並輸入一個數字時,它什麼都不做,但是如果我點擊list_box中的下一個項目,它可以正常工作。這讓我覺得我的方法沒有從list_box獲取它的值。這裏的代碼:list_box在啓動時不會使用默認值 - Shoes。

Shoes.app :title=> 'Temperature Converter', :width => 200, :height => 200 do 
    def convert(temp, unit='C') 
    if unit == "C" 
    (temp.to_i * 9.0/5.0) + 32.0 
elsif unit == "F" 
    "Fail" 
end 
end 
    list_box :items => ["C", "F"], :choose => "C" do |item| 
    @unit.text = item.text 
    end 
    line1 = edit_line :width => 100 
    button 'Compute' do 
    @result.text = convert(line1.text, @unit.text) 
    end 
    @unit = para 
    @result = para 
    end 

我試着設置'C'作爲默認變量,但也沒有工作。有沒有辦法強制list_box在啓動時發送它的值?

此外,如果我從末尾刪除「@unit = para」,它將不會打印任何內容,即使是@result也不相關。這是爲什麼?

任何幫助都會很棒。

回答

0

它可能不會打印任何內容,因爲您的按鈕和list_box正在嘗試呼叫@unit.text,因此您必須繼續定義​​。

我認爲這可能是相同的原因,它不會選擇「C」默認情況下。當您選擇「C」時,​​未定義。

試試這個:

@list_box = list_box :items => ["C", "F"] 
line1 = edit_line :width => 100 
button 'Compute' do 
    @result.text = convert(line1.text, @unit.text) 
end 
@unit = para 
@list_box.change{|item| 
    @unit.text = item.text 
} 
@list_box.choose("C") 

我不確定你是否需要該change方法從列表框中分開,但我這樣做是在安全方面。

編輯:2012-01-31 13:29

Shoes.app :title=> 'Temperature Converter', :width => 200, :height => 200 do 
    def convert(temp, unit='C') 
    @unit.text = unit 
    if unit == "C" 
     (temp.to_i * 9.0/5.0) + 32.0 
    elsif unit == "F" 
     "Fail" 
    end 
    end 
    @list_box = list_box :items => ["C", "F"] 
    line1 = edit_line :width => 100 
    button 'Compute' do 
    @result.text = convert(line1.text, @list_box.text) 
    end 
    @unit = para 
    @list_box.choose("C") 
    @result = para 
end 
+0

我試過了您的代碼,但現在計算完全不會出現! – facetoe 2012-01-31 01:11:54

+0

我注意到了這個問題。在計算中使用它之前,我認爲將值傳遞給'@ unit.text'是一個不必要的複雜層。嘗試將我編輯的代碼放入我的答案中。這個對我有用。 – SimonMayer 2012-01-31 01:33:21

+0

這很有魅力。謝謝! – facetoe 2012-01-31 04:08:37

0

原因運算的代碼檢索列表框中的初始值沒有成功是因爲給list_box()的塊只執行onchange,即當用戶更改列表框中的選擇時。按鈕點擊代碼的代碼檢索para的當前值,可怕地命名爲「list_box」 - 但para只在列表框的onchcange事件觸發時設置,並且para的初始值設置爲空。

單擊按鈕時獲取列表框初始值的方法是不依賴於onchange事件。相反,當點擊按鈕時,只需查詢列表框中的當前值,例如@ my_listbox.text。

但是,查詢列表框的當前值並不直接在應用程序塊內工作 - 顯然直到應用程序塊完成執行後列表框纔會存在。在這種情況下,您需要手動設置列表框的初始值:

@default_choice = "red" 
@current_choice = "red" 

list_box :items => ["blue", "red", "green"], :choose => @default_choice do |list| 
    @current_choice = list.text 
end