在Tcl/Tk输入字段中强制输入大写字母

在Tcl/Tk输入字段中强制输入大写字母,tcl,validation,tk,Tcl,Validation,Tk,我有一个带有输入框的Tcl/Tk窗口,我想在其中强制输入大写字符。也就是说,如果输入了任何字母,我希望它们以大写字母显示在输入字段中,而不是简单地拒绝任何小写输入 我已经查看了Tcl/Tk wiki上的文档和页面,但我一定找不到正确的位置,因为尽管有很多验证示例,但我找不到过滤键输入以更改案例的示例 我能得到的最接近的结果如下: entry .message -validate key -validatecommand { .message insert %i [string toupp

我有一个带有输入框的Tcl/Tk窗口,我想在其中强制输入大写字符。也就是说,如果输入了任何字母,我希望它们以大写字母显示在输入字段中,而不是简单地拒绝任何小写输入

我已经查看了Tcl/Tk wiki上的文档和页面,但我一定找不到正确的位置,因为尽管有很多验证示例,但我找不到过滤键输入以更改案例的示例

我能得到的最接近的结果如下:

entry .message -validate key -validatecommand {
    .message insert %i [string toupper "%S"]
    return 0
}

这将强制键入的第一个字符为大写,但后续字符不会被翻译。事实上,在第一个字符之后根本不会调用validate脚本。如果我在测试中省略了
.message insert
命令,则会为每个字符调用验证脚本。

如果在验证命令中为条目设置新值,则会关闭验证(可能是为了防止无限循环)。但是,您可以在以后将其重新打开:

entry .message -validate key -validatecommand {
    .message insert %i [string toupper "%S"]
    .message configure -validate key
    return 0
}

或者,您可以使用事件和绑定:

entry .message
bind .message <KeyRelease> {
    set v [string toupper [.message get]]
    .message delete 0 end
    .message insert 0 $v
    }

pack .message
entry.message
绑定。消息{
设置v[string toupper[.message get]]
.邮件删除0结束
.邮件插入0$v
}
打包。留言

这给出了您可以考虑执行的操作类型的概念-事件中的处理在这里非常简单,可以大大改进。

注意,我还必须检查操作类型(
%d
)以确保它是1(插入),否则删除文本将不起作用。