2016-08-10 9 views
0

Ruby Tkを使用して、ネストされたループにデバイスの外部ループ(Foo、Bar、Baz)とそれぞれのアクションの内部ループデバイス(開始、停止、一時停止、核)。ネストされたループでRuby Tkラジオボタンを作成するには

現在のコード:

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個のラジオボタンが生成されますが、すべてが1つのセットです。すなわち、12のうちの1つだけが任意の所定の時間に設定される。

これらを4つのラジオボタンの3つのセットにグループ分けするには何が必要ですか?

(このコードは、それがsymanticallyあまり意味がありません理由ですはるかに大きいアプリケーションからダウン切り詰めている。)

+0

(NB:私はTkの*インターフェースを見て行きませんでした。)Iドン'' '' button_variables'''' 'がどこに設定されているのか見ていませんか?それは問題の一部である可能性があります... –

+0

それぞれの 'button_variables [i]'を設定しても振る舞いは変わりません。 –

+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 
関連する問題