2009-09-15 6 views
0

Le widget BWidget ComboBox vous permet de remplir un champ d'entrée avec une valeur. Je voudrais appliquer uniquement des caractères spécifiques dans ce champ (par exemple seulement [a-z0-9]). A cet effet, je voudrais utiliser Tcl/Tk de -validatecommand (ou -vcmd pour faire court), comme vous le faites avec le widget standard « entrée »:Valider l'entrée avec ComboBox de BWidget

proc ValidateMyEntry { value } { 
    # Check if it's alphanum string 

    if ![regexp {^[-a-zA-Z0-9]*$} $value] { 
     return 0 
    } 
    return 1 
} 

entry .my_entry -width 20 -textvariable myVar -validate key -vcmd {ValidateMyEntry %P} 

Il semble ComboBox ne supporte pas -validatecommand . Quel est le meilleur travail autour?

Répondre

0

Comme quelque chose qui était possible mais un peu lourd, j'ai décidé d'utiliser la fonction 'trace variable' à l'ancienne pour appliquer des valeurs dans la zone de liste déroulante.

Placez l'instruction suivante après l'appel ComboBox:

trace variable myVar w forceAlphaNum 

Par ailleurs, vous devez définir le forceAlphaNum proc:

proc forceAlphaNum { name el op } { 
    if { $el == "" } { 
     set newname $name 
     set oldname ${name}_alphanum 
    } else { 
     set newname ${name}($el) 
     set oldname ${name}_alphanum($el) 
    } 

    global $newname 
    global $oldname 

    if { ![info exist $oldname] } { 
     set $oldname "" 
    }  

    # Check if it's alphanum string 
    if ![regexp {^[a-zA-Z0-9]*$} [set $newname]] { 
     set $newname [set $oldname] 
     bell; return 
    } 
    set $oldname [set $newname] 
} 
0

Si vous souhaitez utiliser un BWidget, vous pouvez essayer avec -modifycmd ou -postcommand.

De toute façon je vous suggère d'essayer le ttk :: combobox avec l'option -postcommand.

+0

Oui, je peux utiliser -modifycmd, mais il déclenche seulement après un La valeur (illégale) a été renseignée. Donc si je veux empêcher un espace, avec -vcmd l'espace ne sera même pas inséré, alors qu'avec modifycmd il est inséré et vous devriez le supprimer plus tard. – Roalt

+0

J'ai une restriction sur l'utilisation de Tcl/Tk 8.4 pour le moment. ttk :: combobox est inclus dans Tcl/Tk 8.5. – Roalt

+0

L'autre option (que je n'ai pas testée) consiste à utiliser l'option -textvariable et à ajouter une trace à la variable. Dans tous les cas, vous devrez supprimer les caractères non pris en charge. La dernière option, et celle-ci nécessite un travail supplémentaire, est de capturer le "focus in" de votre combobox et montrer une entrée dans les mêmes coordonnées. C'est difficile mais j'ai fait quelque chose de similaire il y a quelques années. –