2017-08-24 2 views
0

Je veux générer plusieurs combobox et boutons dans la boucle for, et la commande de bouton appelle la fonction et vérifie le contenu de la liste déroulante, comment obtenir la variable "com $ num" et passe à la fonction "get_optimizer"? Comment corriger le script ci-dessous? Pls aide, merci!TCL/TK Comment générer des comboboxs/boutons dans la boucle for et appeler la fonction?

set num 1 
foreach SQ {1 2 3 4 5} { 
    ttk::combobox $twind.frame.dpcom$num -textvariable com$num -values {Global Definitive Adaptive Cmaes} 
    button $twind.frame.but$num -text "Optimizer Setting" -command [list get_optimizer] 
    grid $twind.frame.dpcom$num -row $num -column 0 
    grid $twind.frame.but$num -row $num -column 1 
    incr num} 

proc get_optimizer {} { 
    global [set com$num] 
    if {[set com$num]=='Global'} { 
      ... 
     } elseif {[set com$num]=='Definitive'} { 
      ... 
     } elseif {...} { 
      ...} 
     ... 
    } 

Répondre

0

Utilisez

global com$num 

(vous donnant, par exemple, COM1 global)

au lieu de

global [set com$num] 

(disons, définitive mondiale vous donne,)

+0

Cela fonctionne ... mais ne fait pas ce que le questionneur veut. –

1

Vous devriez passer le entier nom de la variable en get_optimizer et utilisez upvar #0 pour indiquer un nom d'alias local fixe dans la procédure.

# backslash-newline for readability only 
    button $twind.frame.but$num -text "Optimizer Setting" \ 
      -command [list get_optimizer com$num] 
proc get_optimizer {varname} { 
    upvar #0 $varname theVar 
    if {$theVar=='Global'} { 
     ... 
    } elseif {$theVar=='Definitive'} { 
     ... 
    } elseif {...} { 
     ... 
    } 
    ... 
} 

En outre, il est plus efficace d'utiliser l'opérateur eq pour l'égalité des cordes. Et déterminez s'il est préférable d'utiliser un tableau (c'est-à-dire com(1) au lieu de com1).

+0

Super! C'est vraiment ce que je veux, merci beaucoup! – Jimmy