Skip to content

Entry 组件

Entry 组件就是平时所说的输入框。输入框是跟程序打交道的一个途径,例如程序要求你输入账号密码,那么它就需要提供两个输入框给你,用于接收密码的输入框还会用星号将实际输入的内容隐藏起来。

语法格式如下:

python
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()方法:

python
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()

image-20201201155820087

获取输入框里边的内容,可以使用 Entry 组件的 get() 方法。当然也可以将一个 tkinter 的变量(通常是 StringVar)挂钩到 textvariable 选项,然后通过变量的 get() 方法获取。

在下面的例子中,添加一个按钮,当单击按钮的时候,获取输入框的内容并打印出来,然后清空输入框。

案例:登录页面

如果想设计一个密码输入框,即使用星号(*)代替用户输入的内容,只需要设置 show 选项即可:

python
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()

image-20201201160058440

验证登录

另外,Entry 组件还支持验证输入内容的合法性。例如输入框要求输入的是数字,用户输入了字母那就属于“非法”。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 三个选项。

首先启用验证的“开关”是 validate 选项,该选项可以设置的值

其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。

在下面的例子中,在第一个输入框中输入内容之后并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发:

python
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 被触发:

python
def verify_test():
    if e1.get() == '青灯教育-正心':
        print('验证成功')
        return True
    else:
        print('验证失败')
        e1.delete(0, tk.END)
        return False

随便输入内容之后按 tab 键,就会显示验证失败

输入正确的内容就会显示验证成功

image-20201201160555206

验证函数

其实,tkinter 还有个“隐藏技能”—— tkinter 为验证函数提供一些额外的选项。

tkinter 为验证函数提供一些额外的选项

为了使用这些选项,你可以这样写:

python
validatecommand = (f, s1, s2, ...)

其中,f 是验证函数名,s1、s2、s3 是额外的选项,这些选项会作为参数依次传给 f 函数。在此之前,需要调用 register() 方法将验证函数包装起来

下面实现一个简单的计算器:

python
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()

image-20201201160841019