質問
BWidget ComboBox ウィジェットを使用すると、入力フィールドに値を入力できます。そのフィールドに特定の文字のみを適用したい(例[a-z0-9]のみ)。そのために、標準の「エントリ」ウィジェットを使用するのと同じように、Tcl / Tkの -validatecommand (または略して-vcmd)を使用します。
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
可能なことですが、少し面倒なので、古いスタイルの「トレース変数」関数を使用してコンボボックスの値を強制することにしました。
ComboBox呼び出しの後に次のステートメントを追加します。
trace variable myVar w forceAlphaNum
他の場所では、forceAlphaNum procを定義する必要があります:
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を試してください。
とにかく、-postcommandオプションを指定してttk :: comboboxを試すことをお勧めします。
所属していません StackOverflow