Tcl 如何将proc作为变量名附加到由循环创建的按钮

Tcl 如何将proc作为变量名附加到由循环创建的按钮,tcl,tk,Tcl,Tk,帮助我解决我的一个问题,我抓住我的想法继续前进。 我正在foreach循环中创建一个单选按钮。我还希望每个按钮都有一个不同的-command选项,因为我不确定将创建多少个按钮(它总是动态的),所以我将它放在foreach循环中 此外,我将附加一个proc作为变量,因此每当单击这些单选按钮中的任何一个时,proc的函数体都将执行,但此代码无法正常运行,并且在选择单选按钮时抛出错误。 我认为变量$elem和$w没有传递给proc proc check_lib_name {} { global

帮助我解决我的一个问题,我抓住我的想法继续前进。 我正在foreach循环中创建一个单选按钮。我还希望每个按钮都有一个不同的-command选项,因为我不确定将创建多少个按钮(它总是动态的),所以我将它放在foreach循环中

此外,我将附加一个proc作为变量,因此每当单击这些单选按钮中的任何一个时,proc的函数体都将执行,但此代码无法正常运行,并且在选择单选按钮时抛出错误。 我认为变量$elem和$w没有传递给proc

proc check_lib_name {} {
   global ENTRYfilename5 ENTRYfilename f mylist elem w
   cd $ENTRYfilename
   set dirnames [glob -type d *]
   set b 7
   set mylist {}
   foreach f $dirnames {
      set r 2
      lappend mylist $f
   }

   set w 0
   foreach elem $mylist {
      radiobutton .top.d.$elem -text $elem -command $elem.$w -value $elem.abc
      grid .top.d.$elem -row $b -column $r -sticky nsew
      incr b
      incr w
   }

   #### Proc attached with radiobuttons
   proc $elem.$w {} {
      global ENTRYfilename5 ENTRYfilename elem w
      cd $elem
      set rrpath [glob -type d *]
      puts $rrpath
      set del "/"
      set klpath [concat [string trim $ENTRYfilename][string trim $del][string trim  $elem][string trim $del][string trim $rrpath]]
      puts $klpath
      cd $klpath
      exec [myRun.sh]
   }
}

在foreach循环运行之后,
$elem
$w
的值将是它们拥有的最后一个值,这也意味着您只创建了一个进程,这是最后一个单选按钮

我不认为这是一个好主意,使每一个配给按钮1个进程。使用1个接受参数的泛型进程

...
radiobutton .top.d.$elem -text $elem -command [list radiofunction $elem $w] -value $elem.abc
...
然后


radiofunction
只是一个示例名称。

在foreach循环运行后,
$elem
$w
的值将是它们拥有的最后一个值,这也意味着您只创建了一个进程,这是最后一个单选按钮

我不认为这是一个好主意,使每一个配给按钮1个进程。使用1个接受参数的泛型进程

...
radiobutton .top.d.$elem -text $elem -command [list radiofunction $elem $w] -value $elem.abc
...
然后


radiofunction
只是一个示例名称。

谢谢@Jerry,我尝试过这个方法,但它只允许一次选择单选按钮,当我想在单选按钮之间切换时,它会抛出错误,说目录不存在。@Danishheikh这可能是程序体的问题。你到底是从哪里得到错误的?同样使用如此多的
global
看起来很可疑。我知道问题是由于我的程序中的“cd”,我最终移动到$klpath,它基本上是指向目录的路径,如果我重新选择另一个单选按钮,它会将另一个值设置为$elem,并且无法从$klpath访问$elem。我考虑在进程开始时使用pushd,在进程结束后使用popd。我确实尝试使用exec[pushd$ENTRYfilename],但似乎不起作用。@DanishSheikh为什么不使用绝对路径?我不能使用绝对路径,因为,$ENTRYfilename是用户通过UI输入的路径,它将是动态的。我只是将输入框内容传递给脚本。谢谢@Jerry,我尝试过这个方法,但它只允许进行一次单选按钮选择,当我想在单选按钮之间切换时,它会抛出错误,说目录不存在。@DanishSheikh这可能是程序体的问题。你到底是从哪里得到错误的?同样使用如此多的
global
看起来很可疑。我知道问题是由于我的程序中的“cd”,我最终移动到$klpath,它基本上是指向目录的路径,如果我重新选择另一个单选按钮,它会将另一个值设置为$elem,并且无法从$klpath访问$elem。我考虑在进程开始时使用pushd,在进程结束后使用popd。我确实尝试使用exec[pushd$ENTRYfilename],但似乎不起作用。@DanishSheikh为什么不使用绝对路径?我不能使用绝对路径,因为,$ENTRYfilename是用户通过UI输入的路径,它将是动态的。我只是将输入框内容传递给脚本。这看起来是错误的:
exec[myRun.sh]
--您可能需要
exec myRun.sh
。使用您拥有的代码,Tcl将调用Tcl proc
myRun.sh
,然后使用该proc的返回值作为
exec
的参数。这看起来是错误的:
exec[myRun.sh]
——您可能需要
exec myRun.sh
。使用您拥有的代码,Tcl将调用Tcl proc
myRun.sh
,然后使用该proc的返回值作为
exec
的参数。