这篇博客接着讲entry的验证函数,不过主要是使用的Tkinter的隐藏功能,也就是关于验证函数的一些额外的选项。
如下图所示:
为了使用这些选项,我们可以这样修改我们的validatecommand选项:
validatecommand=(f,s1,s2,……)
其中,f是验证函数名,s1,s2等是额外的选项,这些选项会作为参数一次传给f函数,再次之前需要将register()方法将验证函数包装起来。
from tkinter import *
master = Tk()
v = StringVar()
def test(content,reason,name):
if content == '小甲鱼':
print('正确!')
print(content,reason,name)
return True
else :
print('错误')
print(content,reason,name)
return False
testCMD = master.register(test)
e1 = Entry(master,textvariable=v,validate='focusout',\
validatecommand=(testCMD,'%P','%v','%W'))
e2 = Entry(master)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()
下面我们结合Tkinter的隐藏选项实现一个简单的计算器。
from tkinter import *
master = Tk()
frame = Frame(master)
frame.pack(padx=10,pady=10)
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
'''
注意在这里我们不能使用entry控件的get()方法来获取输入的内容
因为当validate选项指定为key的时候,有任何的输入操作都会被拦截
到这个函数当中,也就是说先拦截,只有这个函数返回True,那么输入的内容
才会到变量里面去,也就是说我们使用get函数并无法get到数据,get函数在这个
函数之后才会有效,get函数得到的是变量的值。
所以只有使用%P来获得最新的输入框的内容
'''
def test(content):
if content.isdigit():
return True
else:
return False
#使用了特殊技能的函数需要使用register将其封装起来才可以
testCMD = master.register(test)
e1 = Entry(frame,width=10,textvariable=v1,validate='key',\
validatecommand=(testCMD,'%P')).grid(row=0,column=0)
Label(frame,text='+').grid(row=0,column=1)
e2 = Entry(frame,width=10,textvariable=v2,validate='key',\
validatecommand=(testCMD,'%P')).grid(row=0,column=2)
Label(frame,text='=').grid(row=0,column=3)
e3 = Entry(frame,width=10,textvariable=v3,state='readonly').grid(row=0,column=4)
def calc():
result=int(v1.get())+int(v2.get())
v3.set(str(result))
Button(frame,text='计算结果',command=calc).grid(row=1,column=2,padx=5)
mainloop()
程序运行如下图所示: