tkinter库内的Entry组件很全面,甚至自带了输入时候的验证功能。比如我们要设计一个计算器时,我们不允许输入为字符串,只允许为数字。
实现该功能,就要设置选项validate, validatecommand和invalidcommand
1:实现验证功能的选项为validate,该选项的可选值为(字符串)
focus | 当Entry组件获得或失去焦点的时候验证(当Entry组件获得或失去焦点的时候调用validate-command指定的验证函数) | |
focusin | 当Entry组件获得焦点的时候验证 | |
focusout | 当Entry组件失去焦点的时候验证 | |
key | 当输入框被编辑的时候验证 | |
all | 当出现上面任何一种情况的时候验证 | |
none | ①关闭验证功能 ②默认设置该选项(即不用启用验证) ③注意:是字符串的'none',而非None |
|
2:validatecommand选项绑定一个函数, 该函数只能返回 True 或 False 表示验证的结果,一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
3:invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才会被调用。
from tkinter import *
root = Tk()
v1 = StringVar()
v2 = StringVar()
#验证是否全为数字
def test():
return v1.get().isdigit()
def test2():
print('invalidcomman')
Entry(root, textvariable=v1, validate='focusout', validatecommand=test,\
invalidcommand=test2).pack()
Entry(root, textvariable=v2, validate='focusout').pack()
mainloop()
#会输出 invalidcommand
Tkinter 为验证函数提供一些额外的选项:
%d | 操作代码:0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改 |
%i | 当用户尝试插入或删除操作的时候,该选项表示插入或删除的位置(索引号) 如果是由于获得、失去焦点或textvariable变量的值被修改而调用验证函数,那么该值是-1 |
%P | 当输入框的值允许被改变的时候,该值有效 该值为输入框的最新文本内容 |
%s | 该值为调用验证函数前输入框的文本内容 |
%S | 当插入或删除操作触发验证功能的时候,该值有效 该选项表示文本被插入和删除的内容 |
%v | 该组件当前的validate选项的值 |
%V | 调用验证函数的原因 该值是'focusin'、'focusout'、'key'或'focused'(textvariable选项指定的变量值被修改)中的一个 |
%W | 该组件的名字(在Tkinter内部会注册一个名字,显示的是注册的名字,类似于句柄) |
下面为一个简单的加法计算器:
from tkinter import *
root = Tk()
def test(content):
return content.isdigit()
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
testCMD = root.register(test)
e1 = Entry(root, textvariable=v1, validate='key', \
validatecommand=(testCMD, '%P'), width=10).grid(row=0, column=0)
Label(root, text='+').grid(row=0, column=1)
e2 = Entry(root, textvariable=v2, validate='key', \
validatecommand=(testCMD, '%P'), width=10).grid(row=0, column=2)
Label(root, text='=').grid(row=0, column=3)
e3 = Entry(root, textvariable=v3, state='readonly', validate='key', width=10).\
grid(row=0, column=4)
def calc():
result = int(v1.get()) + int(v2.get())
v3.set(str(result))
Button(root, text='计算', command=calc, width=10).grid(row=1, column=2, pady=5)
mainloop()