Entry 组件的基本用法
Entry 的 show, width 属性
Entry 的验证功能
Label 组件的 row, column 属性
Button 组件的 sticky 属性
Entry组件:输入框
输入框是和程序打交道的一个途径。比如说程序要求输入账号和密码,就需要提供两个输入框,接受密码的输入框还会用*星号将实际内容隐藏起来。
学了好几个 Tkinter 的组件,不难发现,很多方法和选项之间是通用的,意思是名字一样,内容也一样。比如说,在输入框中用代码增加和删除内容,就是使用 insert() 和 delete() 方法。
from tkinter import *
root = Tk()
e = Entry(root)
e.pack(padx=20, pady=20)
e.delete(0, END) #将输入框里面的内容清空
e.insert(0, '默认文本在此!')
mainloop()
获取数据框里的内容,可以使用 Entry 组件里的 get 方法。也可以将 Tkinter 的变量,通常是字符串类型的变量挂钩到 textvariable 选项上,再通过变量的 get 方法获取也是可以的。
from tkinter import *
#tkinter提供了三种布局组件的方式,第一种是pack()
# 第二种是Grid()网格,第三种是prase()
root = Tk()
e1 = Entry(root,width =25)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25)
e2.grid(row = 1,column = 1,padx = 10,pady = 5)
l1 = Label(root,text = '作品:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '作者:')
l2.grid(row = 1,column = 0)
def getmessage():
print( '作品:《%s》' % (e1.get()) )
print( '作者:%s' % e2.get() )
b1 = Button(root,text = '获取信息',width = 10,command = getmessage)
b1.grid(row = 2,column = 0,padx = 10,pady = 5)
b1 = Button(root,text = '退出',width = 10,command = root.quit)
b1.grid(row = 2,column = 1,padx = 10,pady = 5)
mainloop()
实现密码框的用星号代替实际内容,可以通过 Entry 的 show 参数来实现:
l1 = Label(root,text = '账号:')
l1.grid(row = 0,column = 0)
l2 = Label(root,text = '密码:')
l2.grid(row = 1,column = 0)
v1 = StringVar()
v2 = StringVar()
e1 = Entry(root,width =25,textvariable = v1)
e1.grid(row = 0,column = 1,padx = 10,pady = 5)
e2 = Entry(root,width =25,textvariable = v2,show = '*')
e2.grid(row = 1,column = 1,padx = 10,pady = 5)
如果想要设计一个计算器,除了数字以外不允许其他字符出现,该怎么设计呢?
Entry 组件本身就自带了验证功能,就是可以验证输入框里面内容的合法性。实现该功能,就要设置选项 validate, validatecommand 和 invalidcommand
首先启用验证的” 开关” 是 validate 选项,该选项可以设置的值有:
focus
当Entry组件获得或失去焦点的时候验证(当Entry组件获得或失去焦点的时候调用validate-command指定的验证函数)
focusin
当Entry组件获得焦点的时候验证
focusout
当Entry组件失去焦点的时候验证
key
当输入框被编辑的时候验证
all
当出现上面任何一种情况的时候验证
none
①关闭验证功能
②默认设置该选项(即不用启用验证)
③注意:是字符串的'none',而非None
其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果,一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
from tkinter import *
master = Tk()
def test():
if e1.get() == '我爱学习':
print('继续努力!')
return True
else:
print('你在说什么鬼话')
e1.delete(0, END)
return False
v = StringVar()
e1 = Entry(master, textvariable=v, validate='focusout', validatecommand=test) #当焦点移出的时候调用validatecommand设置的函数test
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)
mainloop()
invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才会被调用。
下边的例子中,在第一个输入框输入不是 " 我爱学习 " 以外的字符串,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回 False,接着 invalidcommand 被触发:
其实 Tkinter 还有隐藏功能,不过需要冷却才能实现:
Tkinter 为验证函数提供一些额外的选项:
%d
操作代码:0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改
%i
当用户尝试插入或删除操作的时候,该选项表示插入或删除的位置(索引号)
如果是由于获得、失去焦点或textvariable变量的值被修改而调用验证函数,那么该值是-1
%P
当输入框的值允许被改变的时候,该值有效
该值为输入框的最新文本内容
%s
该值为调用验证函数前输入框的文本内容
%S
当插入或删除操作触发验证功能的时候,该值有效
该选项表示文本被插入和删除的内容
%v
该组件当前的validate选项的值
%V
调用验证函数的原因
该值是'focusin'、'focusout'、'key'或'focused'(textvariable选项指定的变量值被修改)中的一个
%W
该组件的名字(在Tkinter内部会注册一个名字,显示的是注册的名字,类似于句柄)
为了使用这些选项,我们可以这样写:validatecommand=(f, s1, s2, ...)---把它变成了一个元组
其中,f 就是我们 ‘冷却后’ 的验证函数名,s1, s2, s3 这些都是额外的选项,这些选项会作为参数依次传递给 f 函数。我们刚刚说了,使用额外功能前需要冷却,其实就是调用 register() 方法将验证函数包装起来:
from tkinter import *
master = Tk()
def test(content, reason, name): #test不再是没有参数的方法了,参数是在validatecommand里出现的
if content == '我爱学习':
print('继续努力!')
print(content, reason, name)
return True
else:
print('你在说什么鬼话')
print(content, reason, name)
e1.delete(0, END)
return False
v = StringVar()
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()
下面是设计一个简单的加法计算器:
from tkinter import *
root = Tk()
frame = Frame(root)
frame.pack(padx = 10,pady = 10)
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
def test(content):
print(content.isdigit())
return content.isdigit()
testCMD = root.register(test)
e1 = Entry(frame,width = 10,textvariable = v1,validate = "key",\
validatecommand = (testCMD,'%P') )
e1.grid(row = 0,column = 0)
e2 = Entry(frame,width = 10,textvariable = v2,validate = "key",\
validatecommand = (testCMD,'%P') )
e2.grid(row = 0,column = 2)
e3 = Entry(frame,width = 10,textvariable = v3,state = 'readonly')
e3.grid(row = 0,column = 4)
Label(frame,text = '+').grid(row = 0,column = 1)
Label(frame,text = '=').grid(row = 0,column = 3)
def calc():
res = int(v1.get())+int(v2.get())
v3.set(str(res))
b1 = Button(frame ,text = '计算结果',command = calc)
b1.grid(row = 1,column = 2,pady = 5)
mainloop()