The Tkinter Entry Widget
Entry(输入框)组件通常用于获取用户的输入文本。
何时使用 Entry 组件?
Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看到(你可以用鼠标或键盘的方向键调整文本的可见范围)。
如果你希望接收多行文本的输入,可以使用 Text 组件。
用法
使用代码为 Entry 组件添加文本,可以使用 insert() 方法。如果要替换当前文本,可以先使用 delete() 方法,再使用 insert() 方法实现:
1. from tkinter import *
2.
3. master = Tk()
4.
5. e = Entry(master)
6. e.pack(padx=20, pady=20)
7.
8. e.delete(0, END)
9. e.insert(0, "默认文本...")
10.
11. mainloop()
获取当前输入框的文本,可以使用 get() 方法:
1. s = e.get()
你也可以绑定 Entry 组件到 Tkinter 变量(StringVar),并通过该变量设置和获取输入框的文本:
1. v = StringVar()
2. e = Entry(master, textvariable=v)
3. e.pack()
4.
5. v.set("I love FishC.com!")
6. s = v.get()
下边的例子演示将 Entry 组件和 Button 组件配合,点击“获取信息”按钮时自动清空输入框并将内容输出:
1. from tkinter import *
2.
3. master = Tk()
4.
5. Label(master, text="作品:").grid(row=0)
6. Label(master, text="作者:").grid(row=1)
7.
8. e1 = Entry(master)
9. e2 = Entry(master)
10. e1.grid(row=0, column=1, padx=10,pady=5)
11. e2.grid(row=1, column=1, padx=10,pady=5)
12.
13. def show():
14. print("作品:《%s》" % e1.get())
15. print("作者:%s" % e2.get())
16. e1.delete(0, END)
17. e2.delete(0, END)
18.
19. Button(master, text="获取信息", width=10,command=show).grid(row=3, column=0, sticky=W, padx=10, pady=5)
20. Button(master, text="退出", width=10,command=master.quit).grid(row=3, column=1, sticky=E, padx=10, pady=5)
21.
22. mainloop()
最后需要提到的是 Entry 组件允许通过以下几种方式指定字符的位置:
· 数字索引号
· ANCHOR
· END
· INSERT
· 鼠标坐标("@x")
数字索引号:常规的 Python 索引号,从 0 开始
ANCHOR:对应第一个被选中的字符(如果有的话)
END:对应已存在文本的后一个位置
INSERT:对应插入光标的当前位置
鼠标坐标("@x"):x 是鼠标位置与 Entry 左侧边缘的水平距离,这样就可以通过鼠标相对地定位字符的位置
参数
Entry(master=None, **options)(class)
master -- 父组件
**options -- 组件选项,下方表格详细列举了各个选项的具体含义和用法:
选项 | 含义 |
background | 1. 设置 Entry 的背景颜色 |
bg | 跟 background 一样 |
borderwidth | 1. 设置 Entry 的边框宽度 |
bd | 跟 borderwidth 一样 |
cursor | 1. 指定当鼠标在 Entry 上飘过的时候的鼠标样式 |
exportselection | 1. 指定选中的文本是否可以被复制到剪贴板 |
font | 1. 指定 Entry 中文本的字体 |
foreground | 1. 设置 Entry 的文本颜色 |
fg | 跟 foreground 一样 |
highlightbackground | 1. 指定当 Entry 没有获得焦点的时候高亮边框的颜色 |
highlightcolor | 1. 指定当 Entry 获得焦点的时候高亮边框的颜色 |
highlightthickness | 1. 指定高亮边框的宽度 |
insertbackground | 指定输入光标的颜色 |
insertborderwidth | 1. 指定输入光标的边框宽度 |
insertofftime | 1. 该选项控制光标的闪烁频率(灭) |
insertontime | 1. 该选项控制光标的闪烁频率(亮) |
insertwidth | 1. 指定光标的宽度 |
invalidcommand | 1. 指定当输入框输入的内容“非法”时调用的函数 |
invcmd | 跟 invalidcommand 一样 |
justify | 1. 定义如何对齐输入框中的文本 |
relief | 1. 指定边框样式 |
selectbackground | 1. 指定输入框的文本被选中时的背景颜色 |
selectborderwidth | 1. 指定输入框的文本被选中时的边框宽度(选中边框) |
selectforeground | 1. 指定输入框的文本被选中时的字体颜色 |
show | 1. 设置输入框如何显示文本的内容 |
state | 1. Entry 组件可以设置的状态:NORMAL,DISABLED 或 "readonly"(注意,这个是字符串。它跟 DISABLED 相似,但它支持选中和拷贝,只是不能修改,而 DISABLED 是完全禁止) |
takefocus | 1. 指定使用 Tab 键可以将焦点移动到输入框中 |
textvariable | 1. 指定一个与输入框的内容相关联的 Tkinter 变量(通常是 StringVar) |
validate | 1. 该选项设置是否启用内容验证 |
validatecommand | 1. 该选项指定一个验证函数,用于验证输入框内容是否合法 |
vcmd | 跟 validatecommand 一样 |
width | 1. 设置输入框的宽度,以字符为单位 |
xscrollcommand | 1. 与 scrollbar(滚动条)组件相关联 |
方法
delete(first, last=None)
-- 删除参数 first 到last 范围内(包含 first 和 last)的所有内容
-- 如果忽略 last 参数,表示删除 first 参数指定的选项
-- 使用 delete(0, END) 实现删除输入框的所有内容
get()
-- 获得当前输入框的内容
icursor(index)
-- 将光标移动到 index 参数指定的位置
-- 这同时也会设置 INSERT 的值
index(index)
-- 返回与 index 参数相应的选项的序号(例如e.index(END))
insert(index, text)
-- 将 text 参数的内容插入到 index 参数指定的位置
-- 使用 insert(INSERT, text) 将text 参数指定的字符串插入到光标的位置
-- 使用 insert(END, text) 将 text 参数指定的字符串插入到输入框的末尾
scan_dragto(x)
-- 见下方 scan_mark(x)
scan_mark(x)
-- 使用这种方式来实现输入框内容的滚动
-- 需要将鼠标按下事件绑定到 scan_mark(x) 方法(x 是鼠标当前的水平位置),然后再将 <motion> 事件绑定到 scan_dragto(x) 方法(x 是鼠标当前的水平位置),就可以实现输入框在当前位置和 sacn_mack(x) 指定位置之间的水平滚动
select_adjust(index)
-- 与 selection_adjust(index) 相同,见下方解释
select_clear()
-- 与 selection_clear() 相同,见下方解释
select_from(index)
-- 与 selection_from(index) 相同,见下方解释
select_present()
-- 与 selection_present() 相同,见下方解释
select_range(start, end)
-- 与 selection_range(start, end) 相同,见下方解释
select_to(index)
-- 与 selection_to(index) 相同,见下方解释
selection_adjust(index)
-- 该方法是为了确保输入框中选中的范围包含 index 参数所指定的字符
-- 如果选中的范围已经包含了该字符,那么什么事情也不会发生
-- 如果选中的范围不包含该字符,那么会从光标的位置将选中的范围扩展至该字符
selection_clear()
-- 取消选中状态
selection_from(index)
-- 开始一个新的选中范围
-- 会设置 ANCHOR 的值
selection_present()
-- 返回输入框是否有处于选中状态的文本
-- 如果有则返回 True,否则返回 False
selection_range(start, end)
-- 设置选中范围
-- start 参数必须必 end 参数小
-- 使用 selection_range(0, END) 选中整个输入框的所有内容
selection_to(index)
-- 选中 ANCHOR 到 index 参数的间的所有内容
xview(index)
-- 该方法用于确保给定的 index 参数所指定的字符可见
-- 如有必要,会滚动输入框的内容
xview_moveto(fraction)
-- 根据 fraction 参数给定的比率调整输入框内容的可见范围
-- fraction 参数的范围是 0.0 ~ 1.0,0.0表示输入框的开始位置,1.0 表示输入框的结束位置
xview_scroll(number, what)
-- 根据给定的参数水平滚动输入框的可见范围
-- number 参数指定滚动的数量,如果是负数则表示反向滚动
-- what 参数指定滚动的单位,可以是 UNITS 或PAGES(UNITS 表示一个字符单元,PAGES 表示一页)
关于验证详解
由于小甲鱼查看了不少资料,很多在这里都没有解释清楚,所以这里单独列出来详细讲解下。
Entry 组件是支持验证输入内容的合法性的,比如要求输入数字,你输入了字母那就是非法。实现该功能,需要通过设置 validate、validatecommand 和 invalidcommand 选项。
首先启用验证的“开关”是 validate 选项,该选项可以设置的值有:
值 | 含义 |
'focus' | 当 Entry 组件获得或失去焦点的时候验证 |
'focusin' | 当 Entry 组件获得焦点的时候验证 |
'focusout' | 当 Entry 组件失去焦点的时候验证 |
'key' | 当输入框被编辑的时候验证 |
'all' | 当出现上边任何一种情况的时候验证 |
'none' | 1. 关闭验证功能 |
其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过Entry 组件的 get() 方法获得该字符串。
下边的例子中,在第一个输入框输入“小甲鱼”并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发:
1. from tkinter import *
2.
3. master = Tk()
4.
5. def test():
6. if e1.get() == "小甲鱼":
7. print("正确!")
8. return True
9. else:
10. print("错误!")
11. e1.delete(0, END)
12. return False
13.
14. v = StringVar()
15.
16. e1 = Entry(master, textvariable=v,validate="focusout", validatecommand=test)
17. e2 = Entry(master)
18. e1.pack(padx=10, pady=10)
19. e2.pack(padx=10, pady=10)
20.
21. mainloop()
E4.png (2.57KB, 下载次数: 1)
下载附件 保存到相册
2015-3-2313:12 上传
然后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。
下边的例子中,在第一个输入框输入“小鱿鱼”,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回 False,接着 invalidcommand 被触发:
1. from tkinter import *
2.
3. master = Tk()
4.
5. v = StringVar()
6.
7. def test1():
8. if v.get() == "小甲鱼":
9. print("正确!")
10. return True
11. else:
12. print("错误!")
13. e1.delete(0, END)
14. return False
15.
16. def test2():
17. print("我被调用了......")
18. return True
19.
20. e1 = Entry(master, textvariable=v,validate="focusout", validatecommand=test1, invalidcommand=test2)
21. e2 = Entry(master)
22. e1.pack(padx=10, pady=10)
23. e2.pack(padx=10, pady=10)
24.
25. mainloop()
E5.png (3.48KB, 下载次数: 1)
下载附件 保存到相册
2015-3-2314:06 上传
最后,其实 Tkinter 还有隐藏技能,不过需要冷却才能触发,请听小甲鱼一一道来......
Tkinter 为验证函数提供一些额外的选项:
额外选项 | 含义 |
'%d' | 操作代码:0 表示删除操作;1 表示插入操作;2 表示获得、失去焦点或 textvariable 变量的值被修改 |
'%i' | 1. 当用户尝试插入或删除操作的时候,该选线表示插入或删除的位置(索引号) |
'%P' | 1. 当输入框的值允许改变的时候,该值有效 |
'%s' | 该值为调用验证函数前输入框的文本内容 |
'%S' | 1. 当插入或删除操作触发验证函数的时候,该值有效 |
'%v' | 该组件当前的 validate 选项的值 |
'%V' | 1. 调用验证函数的原因 |
'%W' | 该组件的名字 |
为了使用这些选项,你可以这样写:validatecommand=(f, s1, s2, ...)
其中,f 就是你“冷却后”的验证函数名,s1、s2、s3 这些是额外的选项,这些选项会作为参数依次传给 f 函数。我们刚刚说了,使用隐藏技能前需要冷却,其实就是调用 register() 方法将验证函数包装起来:
1. from tkinter import *
2.
3. master = Tk()
4.
5. v = StringVar()
6.
7. def test(content, reason, name):
8. if content == "小甲鱼":
9. print("正确!")
10. print(content, reason, name)
11. return True
12. else:
13. print("错误!")
14. print(content, reason, name)
15. return False
16.
17. testCMD = master.register(test)
18. e1 = Entry(master, textvariable=v,validate="focusout", validatecommand=(testCMD, '%P', '%v', '%W'))
19. e2 = Entry(master)
20. e1.pack(padx=10, pady=10)
21. e2.pack(padx=10, pady=10)
22.
23. mainloop()