Подтвердите запись с помощью BWidget ComboBox

StackOverflow https://stackoverflow.com/questions/1427380

  •  07-07-2019
  •  | 
  •  

Вопрос

Виджет BWidget ComboBox позволяет заполнить поле ввода значением. Я хотел бы использовать только определенные символы в этом поле (например, только [a-z0-9]). Для этой цели я бы хотел использовать -validatecommand (или для краткости -vcmd) в Tcl / Tk, так же, как вы делаете со стандартным виджетом '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 не поддерживает команду -validate. Какой лучший обходной путь?

Это было полезно?

Решение 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top