我正在尝试使用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。这是为什么?
任何帮助都会很棒。
答案 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