这篇博客接着讲entry的验证函数,不过主要是使用的Tkinter的隐藏功能,也就是关于验证函数的一些额外的选项。
如下图所示:
‘这些选项都是带引号的’
为了使用这些选项,我们可以这样修改我们的validatecommand选项:
validatecommand=(f,s1,s2,……)
其中,f是验证函数名,s1,s2等是额外的选项,这些选项会作为参数一次传给f函数,再次之前需要将register()方法将验证函数包装起来。
from tkinter import *
root = Tk()
v = StringVar()
def test(f,s1,s2):
if f == '小甲鱼':
print('正确')
print(f,s1,s2)
return True
else:
print('错误')
print(f,s1,s2)
return False
test_register = root.register(test) #root调用register方法才能用到下边的validatecommand选项中
e1 = Entry(root,textvariable = v,validate = 'focusout',\
validatecommand = (test_register,'%P','%i','%s')) #这些额外的参数带引号啊 ,要注意
e2 = Entry(root)
e1.pack()
e2.pack()
mainloop()
'''用验证函数模拟简单计算器'''
from tkinter import *
root = Tk()
frame = Frame(root) #把整个布局放到框架中,更好调节
frame.pack(padx = 10,pady = 10)
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
def test(content):
if content.isdigit():#isdigit()方法,这是str的一个函数,只允许输入数字
return True
else:
return False
testCmd = root.register(test)#通过register方法转换为validatecommand选项能接收的函数
Entry(frame,textvariable = v1,width = 10,validate = 'key',\
validatecommand = (testCmd,'%P')).grid(row = 0,column = 0) #用%P获取最新输入的字符串,而不用v1.get()小甲鱼说了很多,没看明白,这就不写了,呵呵
Label(frame,text = '+').grid(row = 0,column = 1)
Entry(frame,textvariable = v2,width = 10,validate = 'key',\
validatecommand = (testCmd,'%P')).grid(row = 0,column = 2)
Label(frame,text = '=').grid(row = 0,column = 3)
Entry(frame,textvariable = v3,width = 10,state = 'readonly',validate = 'key',\
validatecommand = (testCmd,'%P')).grid(row = 0,column = 4)
def calc():
result = int(v1.get()) + int(v2.get())
v3.set(result)
Button(frame,text = '计算结果',command = calc).grid(row = 1,column = 2,pady =5)
mainloop()