2016-02-22 1 views
0

Помогите мне в одной из моих проблем, когда я взял свое мышление, чтобы продолжить дальше. Я создаю radobutton внутри цикла foreach. Также хотел, чтобы для каждой из этих кнопок была опция -command, так как я не уверен, сколько кнопок будет создано (оно всегда динамическое), я помещаю его в цикл foreach.Как присоединить proc как имя переменной к кнопке, созданной контуром

Кроме того, я прикрепляю proc как переменную, поэтому всякий раз, когда нажимается любой из этих переключателей, будет выполняться тело функции 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] 
    } 
} 
+0

Это выглядит неправильно: 'exec [myRun.sh]' - вы, вероятно, хотите 'exec myRun.sh'. С кодом, который у вас есть, Tcl вызовет * Tcl proc * 'myRun.sh', а затем использует * возвращаемое значение * этого proc как аргумент' exec'. –

ответ

2

После цикла Еогеаспа побежал, значение $elem и $w будет последнее значение они имели, что также означает, что вы имеете только 1 процедурные и это для последней кнопки.

Я не думаю, что это хорошая идея сделать 1 proc для каждой кнопки рациона. Используйте 1 общий proc, который принимает аргументы.

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

затем

proc radiofunction {elem w} {...} 

radiofunction только в качестве примера имя.

+0

Спасибо @Jerry, я попробовал этот метод, но он только позволяет делать одноразовый выбор радиообъектов, когда я хотел переключаться между радиообъектами, которые он выбрасывает, поскольку ошибка говорит, что директория не существует. –

+1

@DanishSheikh Это, вероятно, проблема с телом proc. Где именно вы получаете сообщение об ошибке? Также использование так много «глобальных» выглядит подозрительно. – Jerry

+0

Я понимаю, что проблема связана с «cd» в моей proc, я, наконец, перехожу к $ klpath, который в основном представляет собой путь к каталогу, если я повторно выбираю другой радиообъект, он устанавливает другое значение $ elem и из $ klpath $ elem не достижимо. Я думаю об использовании pushd в начале proc и popd после завершения proc. Я попытался использовать exec [pushd $ ENTRYfilename], но это, похоже, не работает. –