Entry 组件
Entry 组件就是平时所说的输入框。输入框是跟程序打交道的一个途径,例如程序要求你输入账号密码,那么它就需要提供两个输入框给你,用于接收密码的输入框还会用星号将实际输入的内容隐藏起来。
语法格式如下:
w = Entry( master, option, ... )
master
: 按钮的父容器。options
: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值
的形式设置,并以逗号分隔。
序号 | 可选项 & 描述 |
---|---|
bg | 输入框背景颜色 |
bd | 边框的大小,默认为 2 个像素 |
cursor | 光标的形状设定,如arrow, circle, cross, plus 等 |
font | 文本字体 |
exportselection | 默认情况下,你如果在输入框中选中文本,默认会复制到粘贴板,如果要忽略这个功能刻工艺设置 exportselection=0。 |
fg | 文字颜色。值为颜色或为颜色代码,如:'red','#ff0000' |
highlightcolor | 文本框高亮边框颜色,当文本框获取焦点时显示 |
justify | 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER |
relief | 边框样式,设置控件 3D 效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。 |
selectbackground | 选中文字的背景颜色 |
selectborderwidth | 选中文字的背景边框宽度 |
selectforeground | 选中文字的颜色 |
show | 指定文本框内容显示为字符,值随意,满足字符即可。如密码可以将值设为 show="*" |
state | 默认为 state=NORMAL, 文框状态,分为只读和可写,值为:normal/disabled |
textvariable | 文本框的值,是一个 StringVar() 对象 |
width | 文本框宽度 |
xscrollcommand | 设置水平方向滚动条,一般在用户输入的文本框内容宽度大于文本框显示的宽度时使用。 |
下表为文本框组件常用的方法:
序号 | 方法 & 描述 |
---|---|
delete(first, last=None) | 删除文本框里直接位置值不然 text.delete(10) 删除索引值为10的值 text.delete(10, 20) 删除索引值从10到20之前的值 text.delete(0, END) # 删除所有值 |
get() | 获取文件框的值 |
icursor(index) | 将光标移动到指定索引位置,只有当文框获取焦点后成立 |
index(index) | 返回指定的索引值 |
insert(index, s) | 向文本框中插入值,index:插入位置,s:插入值 |
select_adjust(index) | 选中指定索引和光标所在位置之前的值 |
select_clear() | 清空文本框 |
select_from(index) | 设置光标的位置,通过索引值 index 来设置 |
select_present() | 如果有选中,返回 true,否则返回 false。 |
select_range(start, end) | 选中指定索引位置的值,start(包含) 为开始位置,end(不包含) 为结束位置start必须比end小 |
select_to(index) | 选中指定索引与光标之间的值 |
xview(index) | 该方法在文本框链接到水平滚动条上很有用。 |
xview_scroll(number, what) | 用于水平滚动文本框。 what 参数可以是 UNITS, 按字符宽度滚动,或者可以是 PAGES, 按文本框组件块滚动。 number 参数,正数为由左到右滚动,负数为由右到左滚动。 |
学了前面好几个Tkinter的组件之后应该不难发现——其实很多方法和选项它们之间都是通用的。
例如在输入框中用代码添加和删除内容,同样也是使用insert()和delete()方法:
import tkinter as tk
root = tk.Tk()
root.geometry("500x300+100+100")
e = tk.Entry(root)
e.pack(padx=20, pady=20)
# insert 插入文本
e.insert(0, "默认文本…")
# # get 获取内容
# print(e.get())
# # delete 删除内容
# e.delete(0, tk.END)
root.mainloop()
获取输入框里边的内容,可以使用 Entry 组件的 get() 方法。当然也可以将一个 tkinter 的变量(通常是 StringVar)挂钩到 textvariable 选项,然后通过变量的 get() 方法获取。
在下面的例子中,添加一个按钮,当单击按钮的时候,获取输入框的内容并打印出来,然后清空输入框。
案例:登录页面
如果想设计一个密码输入框,即使用星号(*)代替用户输入的内容,只需要设置 show 选项即可:
import tkinter as tk
root = tk.Tk()
root.geometry("500x300+100+100")
def show():
print('用户名: ', e1.get())
print('密 码: ', e2.get())
e1.delete(0, tk.END)
e2.delete(0, tk.END)
tk.Label(root, text='用户名: ').grid(row=0)
tk.Label(root, text='密 码: ').grid(row=1)
e1 = tk.Entry(root)
e2 = tk.Entry(root, show="*")
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
tk.Button(root, text='登录', width=10, command=show).grid(row=3, column=0, sticky=tk.W, padx=10, pady=5)
tk.Button(root, text='退出', width=10, command=root.quit).grid(row=3, column=1, sticky=tk.W, padx=10, pady=5)
root.mainloop()
验证登录
另外,Entry 组件还支持验证输入内容的合法性。例如输入框要求输入的是数字,用户输入了字母那就属于“非法”。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 三个选项。
首先启用验证的“开关”是 validate 选项,该选项可以设置的值
其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。
在下面的例子中,在第一个输入框中输入内容之后并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发:
import tkinter as tk
root = tk.Tk()
root.geometry("500x300+100+100")
def show():
print('用户名: ', e1.get())
print('密 码: ', e2.get())
e1.delete(0, tk.END)
e2.delete(0, tk.END)
# 自定义验证函数
def verify_test():
if e1.get() == '青灯教育-正心':
print('验证成功')
return True
else:
print('验证失败')
e1.delete(0, tk.END)
return False
tk.Label(root, text='用户名: ').grid(row=0)
tk.Label(root, text='密 码: ').grid(row=1)
e1 = tk.Entry(root, validate='focusout', validatecommand=verify_test)
e2 = tk.Entry(root, show="*")
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
tk.Button(root, text='登录', width=10, command=show).grid(row=3, column=0, sticky=tk.W, padx=10, pady=5)
tk.Button(root, text='退出', width=10, command=root.quit).grid(row=3, column=1, sticky=tk.W, padx=10, pady=5)
root.mainloop()
最后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。
在下面的例子中,在第一个输入框中输入内容,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回False,接着 invalidcommand 被触发:
def verify_test():
if e1.get() == '青灯教育-正心':
print('验证成功')
return True
else:
print('验证失败')
e1.delete(0, tk.END)
return False
随便输入内容之后按 tab 键,就会显示验证失败
输入正确的内容就会显示验证成功
验证函数
其实,tkinter 还有个“隐藏技能”—— tkinter 为验证函数提供一些额外的选项。
tkinter 为验证函数提供一些额外的选项
为了使用这些选项,你可以这样写:
validatecommand = (f, s1, s2, ...)
其中,f 是验证函数名,s1、s2、s3 是额外的选项,这些选项会作为参数依次传给 f 函数。在此之前,需要调用 register() 方法将验证函数包装起来
下面实现一个简单的计算器:
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
frame.pack(padx=10, pady=10)
v1 = tk.IntVar()
v2 = tk.IntVar()
v3 = tk.IntVar()
def verify_test(content: str):
if content.isdigit():
return True
else:
return False
test_cmd = root.register(verify_test)
e1 = tk.Entry(frame, textvariable=v1, width=10, validate='key', validatecommand=(test_cmd, '%P'))
e1.grid(row=0, column=0)
tk.Label(frame, text="+").grid(row=0, column=1)
e2 = tk.Entry(frame, textvariable=v2, width=10, validate='key', validatecommand=(test_cmd, '%P'))
e2.grid(row=0, column=2)
tk.Label(frame, text="=").grid(row=0, column=3)
e3 = tk.Entry(frame, textvariable=v3, width=10, validate='key', validatecommand=(test_cmd, '%P'))
e3.grid(row=0, column=4)
def calc():
result = v1.get() + v2.get()
v3.set(result)
tk.Button(frame, text='计算结果', width=10, command=calc).grid(row=1, column=2, sticky=tk.W, padx=10, pady=5)
root.mainloop()