如何在嵌套循环中创建Ruby Tk单选按钮

时间:2016-08-10 21:13:34

标签: ruby tk

使用Ruby Tk,我想在嵌套循环中创建多组单选按钮:设备的外部循环(Foo,Bar,Baz),以及每个设备上的操作的内部循环(Start,Stop,Pause) ,Nuke)。

当前代码:

require 'tk'

device_names = %w/Foo Bar Baz/
action_names = %w/Start Pause Stop Nuke/

button_variables = Array.new(device_names.size)

root = TkRoot.new

foo = bar = nil

device_names.each_with_index do |device_name, i|
  TkLabel.new(root) do
    text device_name
    pack {}
  end
  action_names.each_with_index do |action_name, j|
    TkRadiobutton.new(root) do
      text action_name
      value j
      variable button_variables[i]
      pack {}
    end
  end
end

Tk.mainloop

这会产生12个单反相机,但是当我点击4个暂停按钮中的任何一个时,例如,所有4个暂停按钮都被设置。

代码的其他变体产生12个radiobutton,但全部为一组;即,在任何给定时间只设置12个中的一个。

需要将这些组合成3组4个无线电按钮?

(这段代码是从一个更大的应用程序中减少的,这就是为什么它在语义上没有多大意义。)

1 个答案:

答案 0 :(得分:0)

作为variable传递的值是全局变量的名称。

外部循环需要通过instance_variable_set动态定义实例变量:

此代码有效:

require 'tk'

device_names = %w/Foo Bar Baz/
action_names = %w/Start Pause Stop Nuke/

root = TkRoot.new

device_names.each do |device_name|
  TkLabel.new(root) do
    text device_name
    pack {}
  end
  instance_variable_set("@#{device_name}", nil)
  action_names.each do |action_name|
    TkRadiobutton.new(root) do
      text action_name
      value action_name
      variable device_name
      pack {}
    end
  end
end

Tk.mainloop