list_box在启动时不会使用默认值 – Shoes。

我正在尝试使用list_box从不同类型的转换中进行选择。 当我启动程序并输入一个数字时它什么也没做,但如果我点击list_box中的下一个项目就可以了。 这让我觉得我的方法没有从list_box获得它的价值。 这是代码:

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。 这是为什么?

任何帮助都是极好的。

它可能不会打印任何东西,因为你的button和list_box试图调用@unit.text ,所以你必须继续定义@unit

我认为这可能与默认情况下不选择“C”的原因相同。 在选择“C”时, @unit

试试这个:

 @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 

op的代码没有成功检索列表框的初始值的原因是因为给list_box()的块仅在更改时执行,即当用户更改列表框中的选择时。 操作代码中的按钮单击检索para的当前值,名为“list_box” – 但是仅在列表框的onchcange事件触发时设置para,并且para的初始值设置为nothing。

单击按钮时获取列表框初始值的方法是不依赖于onchange事件。 相反,当单击按钮时,只需在列表框中查询其当前值,例如@ my_listbox.text。

但是,查询列表框中的当前值并不直接在app块内部工作 – 显然,在app块执行完毕之后,列表框才会存在。 在这种情况下,您需要手动设置列表框的初始值:

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