Validar entrada con ComboBox de BWidget
Pregunta
El widget BWidget ComboBox le permite completar un campo de entrada con un valor. Me gustaría aplicar solo caracteres específicos en ese campo (por ejemplo, solo [a-z0-9]). Para ese propósito, me gustaría usar el -validatecommand de Tcl / Tk (o -vcmd para abreviar), tal como lo hace con el widget estándar de "entrada":
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}
Parece que ComboBox no admite -validatecommand. ¿Cuál es la mejor solución?
Solución 2
Como algo que era posible pero un poco engorroso, decidí usar la antigua función de 'variable de rastreo' para imponer valores en el cuadro combinado.
Ponga la siguiente declaración después de la llamada de ComboBox:
trace variable myVar w forceAlphaNum
En otro lugar, debe definir el proceso 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]
}
Otros consejos
Si desea utilizar un BWidget, puede intentar con -modifycmd o -postcommand.
De todos modos, te sugiero que pruebes el ttk :: combobox con la opción -postcommand.