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

时间:2012-01-30 18:46:43

标签: ruby 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。这是为什么?

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

由于您的按钮和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

答案 1 :(得分:0)

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

单击按钮时获取列表框初始值的方法是不依赖于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