如果要在 Ruby 中制作一个 Tk GUI 并使用不同的全局变量名称制作多个复选框。最有效的方法是什么?
我找到了instance_variable_set,但这不适合我的场景。
我想知道是否有像global_variable_set.
例如。
info = [orange,apple,banana,grape,watermelon]
$var = TkVariable.New
info.each_with_index {|inf,index|
TkCheckButton.new(frame1) do
text "#{inf}"
onvalue "#{inf}"
variable global_variable_set("$var#{index}", inf)
end
end
Run Code Online (Sandbox Code Playgroud)
\n\n\n我想知道是否存在像
\nglobal_variable_set.
是\xe2\x80\x94it\的Module#module_eval。这是您的代码,经过重新设计以使用它:
require \'tk\'\n\n$root = TkRoot.new\n$frame1 = Tk::Tile::Frame.new $root\n\ncheck_buttons = []\ninfo = %w[orange apple banana grape watermelon]\ninfo.each_with_index do |inf,index|\n global_name = "$var#{index}"\n\n cb = Tk::Tile::CheckButton.new $frame1\n cb.text "#{inf}"\n cb.onvalue "#{inf}"\n\n create_global = "#{global_name} = TkVariable.new \'\'"\n Module.module_eval create_global\n\n assign_value = "#{global_name}.value = \'#{inf}\'"\n Module.module_eval assign_value\n\n connect_variable = "cb.variable #{global_name}"\n Module.module_eval connect_variable\n\n check_buttons.push cb\nend\n\np Kernel.global_variables.select {|e| e.id2name.start_with? \'$var\'}\np info.length.times.map {|i| Module.module_eval "$var#{i}.value"}\np check_buttons.map {|e| (e.cget :variable).value}\n\nTk.mainloop\nRun Code Online (Sandbox Code Playgroud)\n\n该程序产生以下输出:
\n\n[:$var0, :$var1, :$var2, :$var3, :$var4]\n["orange", "apple", "banana", "grape", "watermelon"]\n["orange", "apple", "banana", "grape", "watermelon"]\nRun Code Online (Sandbox Code Playgroud)\n\n或者您可以使用更通用的方法Kernel#eval来代替。
\n\n因此,如果您确实想要动态创建全局变量,那么它是可用的。
\n\nCheckbutton方法的Tcl文档可以在这里cget看到。
我在 Windows 7 上使用 Ruby 2.2.5 对此进行了测试。
\n| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |