Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 使用BWidget'验证输入;组合框_Tcl_Bwidget - Fatal编程技术网

Tcl 使用BWidget'验证输入;组合框

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

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
    }
    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(如果编译是一个选项的话)