Подтвердите запись с помощью BWidget ComboBox
Виджет BWidget ComboBox позволяет заполнить поле ввода значением. Я хотел бы применять только определенные символы в этом поле (например, только [a-z0-9]). Для этой цели я хотел бы использовать команду -clidateate команды Tcl/Tk (или -vcmd для краткости), так же, как вы делаете со стандартным виджетом 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}
Кажется, ComboBox не поддерживает -validatecommand. Какой лучший обходной путь?
2 ответа
Что-то, что было возможно, но немного громоздко, я решил использовать функцию 'trace variable' старого стиля для принудительного применения значений в выпадающем списке.
Поместите следующий оператор после вызова ComboBox:
trace variable myVar w forceAlphaNum
В другом месте вы должны определить процесс 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]
}
Если вы хотите использовать BWidget, вы можете попробовать с -modifycmd или -postcommand.
В любом случае, я бы посоветовал вам попробовать ttk::combobox с опцией -postcommand.