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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top