Tcl 使用BWidget'验证输入;组合框
BWidget组合框小部件允许您用值填充输入字段。我只希望在该字段中强制使用特定字符(例如,仅[a-z0-9])。为此,我想使用Tcl/Tk的-validatecommand(简称-vcmd),就像使用标准的“entry”小部件一样:Tcl 使用BWidget'验证输入;组合框,tcl,bwidget,Tcl,Bwidget,BWidget组合框小部件允许您用值填充输入字段。我只希望在该字段中强制使用特定字符(例如,仅[a-z0-9])。为此,我想使用Tcl/Tk的-validatecommand(简称-vcmd),就像使用标准的“entry”小部件一样: proc ValidateMyEntry { value } { # Check if it's alphanum string if ![regexp {^[-a-zA-Z0-9]*$} $value] { return 0
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。最好的解决方法是什么?如果您想使用BWidget,可以尝试使用-modifycmd或-postcommand
无论如何,我建议您尝试使用带有-postcommand选项的ttk::combobox。作为一种可能但有点麻烦的方法,我决定使用老式的“trace variable”函数来强制combobox中的值 将以下语句放在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]
}
是的,我可以使用-modifycmd,但它只有在填写(非法)值后才会触发。因此,如果我想阻止一个空格,使用-vcmd甚至不会插入空格,而使用modifycmd则会插入空格,稍后您应该将其删除。ttk::combobox包含在Tcl/Tk 8.5中。另一个选项(我还没有测试)是使用-textvariable选项,并向变量添加跟踪。在任何情况下,都需要删除不支持的字符。最后一个选项(这一选项需要额外的工作)是捕获组合框的“焦点”,并以相同的坐标显示一个条目。这很棘手,但几年前我也做过类似的事情。我已经考虑过了,正如我在Tcl 8.4之前的时代使用它一样,当时还没有-validatecommand.Roalt,您可以为8.4独立编译Tile/Ttk(如果编译是一个选项的话)