list_box не будет использовать значение по умолчанию при запуске - обувь. - PullRequest
1 голос
/ 30 января 2012

Я пытаюсь использовать 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 голосов
/ 22 июля 2013

Причина, по которой коду операции не удается получить начальное значение списка, заключается в том, что блок, переданный для list_box (), выполняется только при смене, т. Е. Когда пользователь изменяет выбор в списке. Нажатие кнопки в коде операции извлекает текущее значение параметра para со страшным названием «list_box», но этот параметр устанавливается только тогда, когда срабатывает событие onchcange списка, а начальное значение параметра равно нулю.

Способ получения начального значения списка при нажатии кнопки - не полагаться на событие 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
0 голосов
/ 30 января 2012

Вероятно, он ничего не напечатает, потому что ваша кнопка и 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
...