限制空小部件的大小

时间:2018-01-18 14:45:04

标签: python tkinter lambda parameters maxlength

我一直在网上冲浪,寻找不使用“课程”功能但未获得成功的答案。我得到的是3个输入框,例如,我正在尝试使用this function(由DorinPopescu提交),但我没有获取并设置特定的StringVar,我想将相关的StringVar传递给功能,并传递条目的大小。

我试过这个:

def limitSize(entry, max):
    max = int(max)
    value = entry.get()
    if len(value) > max: entry.set(value[:max])

UsernameVar= StringVar()
UsernameVar.trace('w', lambda: limitSize(UsernameVar, 10))
PasswordVar= StringVar()
PasswordVar.trace('w', lambda: limitSize(PasswordVar, 4))
AgeVar= StringVar()
AgeVar.trace('w', lambda: limitSize(AgeVar, 2))

Username=Entry(root, textvariable=UsernameVar).pack()
Password=Entry(root, textvariable=PasswordVar).pack()
Age=Entry(root, textvariable=AgeVar).pack()

2 个答案:

答案 0 :(得分:1)

条目小部件具有专门针对此类事物的选项。您可以设置将验证输入的回调,并拒绝任何违反约束的输入。

这是一个将用户名限制为10个字符,密码限制为4的工作示例:

import Tkinter as tk

def limitSize(new_value, max_len):
    return True if len(new_value) <= int(max_len) else False

root = tk.Tk()
_limitSize = root.register(limitSize)

username = tk.Entry(root, validate="key", validatecommand=(_limitSize, '%P', 10))
password = tk.Entry(root, validate="key", validatecommand=(_limitSize, '%P', 4))
username.pack(fill="x")
password.pack(fill="x")

root.mainloop()

validate选项指定验证何时完成。 "key"导致验证在每个按键上完成。其他值相对不言自明:&#34;无&#34;,&#34;焦点&#34;,&#34;焦点&#34;,&#34;焦点&#34;或&#34;所有& #34;

validatecommand选项指定一个元组,该元组需要一个已向底层tcl解释器注册的命令,以及零个或多个参数。 Tkinter有许多特殊参数可以替换为可用于进行验证的信息。在上面的例子中,&#34;%P&#34;如果允许编辑,则替换为条目小部件的值。您还可以访问编辑类型(插入或删除),仅插入新文本以及其他一些内容。

在这种情况下,如果允许编辑,我们只关心值。要求回调始终返回TrueFalse。如果返回True,则允许修改,如果False,则不允许修改。

要知道的一件重要事情:传递给函数的值将转换为字符串。这就是为什么在上面的示例中max_len在进行比较之前被转换为int。

有关更深入的示例,请参阅此答案:https://stackoverflow.com/a/4140988/7432

答案 1 :(得分:0)

感谢j_4321,请注意在StringVar跟踪中调用limitSize函数时已添加到lambda的'* args'。

def limitSize(entry, max):
    max = int(max)
    value = entry.get()
    if len(value) > max: entry.set(value[:max])

UsernameVar= StringVar()
UsernameVar.trace('w', lambda *args: limitSize(UsernameVar, 10))
PasswordVar= StringVar()
PasswordVar.trace('w', lambda *args: limitSize(PasswordVar, 4))
AgeVar= StringVar()
AgeVar.trace('w', lambda *args: limitSize(AgeVar, 2))

Username=Entry(root, textvariable=UsernameVar).pack()
Password=Entry(root, textvariable=PasswordVar).pack()
Age=Entry(root, textvariable=AgeVar).pack()