在TCL中,如何限制entry
小部件中的输入字符数?
我有一个TCL字段,用户可以在其中输入一些文本,我希望限制文本的长度(例如,不超过30个字符)。
有什么选择吗?
条目验证回调是方法,%P
替换是关键。来自文档:
%p
如果允许编辑,则条目的值。如果您正在将条目小部件配置为具有一个新的文本变量,那么这将是该文本变量的值。
这意味着我们只能这样做:
pack [entry .e -width 50 -validate all -validatecommand {
expr {[string length %P] <= 30}
}]
现在,您将无法对小部件进行任何编辑,因为它的长度超过了30。(最好还添加一个-invalidcommand
规范,这样用户就可以了解发生了什么。)
我认为没有,但您可以在入口小部件上使用验证,如下所示:
package require Tk
pack [entry .e -validate all -validatecommand {max_length %s 30 %d}]
proc max_length {val max act} {
if {[string length $val] >= $max && $act == 1} {
return 0
}
return 1
}
输入框将尝试验证每个输入,并将当前字符串%s
和操作%d
传递给名为max_length
的proc
在此过程中,将检查长度和操作。如果长度大于30,并且操作为1
(表示插入),则proc将返回0,从而停止任何其他插入。