Validez l'entrée avec la ComboBox de BWidget
Question
Le widget BWidget ComboBox vous permet de renseigner un champ de saisie avec une valeur. Je voudrais appliquer uniquement des caractères spécifiques dans ce champ (par exemple, uniquement [a-z0-9]). À cette fin, j'aimerais utiliser la -validatecommand de Tcl / Tk (ou -vcmd en abrégé), comme vous le feriez avec le widget standard 'entry':
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 que ComboBox ne supporte pas -validatecommand. Quel est le meilleur moyen de contourner le problème?
La solution 2
Comme quelque chose qui était possible mais un peu lourd, j'ai décidé d'utiliser la fonction "variable de trace" à l'ancienne pour appliquer des valeurs dans une liste déroulante.
Placez l'instruction suivante après l'appel de la liste déroulante:
trace variable myVar w forceAlphaNum
Ailleurs, vous devez définir le proc forceAlphaNum:
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]
}
Autres conseils
Si vous souhaitez utiliser un BWidget, vous pouvez essayer avec -modifycmd ou -postcommand.
Quoi qu'il en soit, je vous suggère d'essayer ttk :: combobox avec l'option -postcommand.