import tkinter as tk master = tk.Tk() tk.Label(master, text="作品:").grid(row=0) tk.Label(master, text="作者:").grid(row=1) e1 = tk.Entry(master) e2 = tk.Entry(master) e1.grid(row=0, column=1, padx=10, pady=5) e2.grid(row=1, column=1, padx=10, pady=5) def show(): print("作品:《%s》" % e1.get()) print("作者:%s" % e2.get()) e1.delete(0, "end") e2.delete(0, "end") tk.Button(master, text="获取信息", width=10, command=show).grid(row=3, column=0, sticky="w", padx=10, pady=5) tk.Button(master, text="退出", width=10, command=master.quit).grid(row=3, column=1, sticky="e", padx=10, pady=5) master.mainloop()
https://blog.csdn.net/qq_41556318/article/details/85108328
import tkinter as tk master = tk.Tk() def test(): if e1.get() == "CSDN": print("正确!") return True else: print("错误!") e1.delete(0, "end") return False v = tk.StringVar() e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=test) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
import tkinter as tk master = tk.Tk() def test(): if e1.get() == "CSDN": print("正确!") return True else: print("错误!") e1.delete(0, "end") return False def test2(): print("我被调用了......") return True v = tk.StringVar() e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=test, invalidcommand=test2) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
import tkinter as tk master = tk.Tk() v = tk.StringVar() def test(content, reason, name): if content == "CSDN": print("正确!") print(content, reason, name) return True else: print("错误!") print(content, reason, name) return False testCMD = master.register(test) e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=(testCMD, '%P', '%v', '%W')) e2 = tk.Entry(master) e1.pack(padx=10, pady=10) e2.pack(padx=10, pady=10) master.mainloop()
方法
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. 关闭验证功能
2. 默认设置该选项(即不启用验证)
3. 注意,是字符串的 'none',而非 None
其次是为 validatecommand 选项指定一个验证函数,该函数只能返回 True 或 False 表示验证的结果。一般情况下验证函数只需要知道输入框的内容即可,可以通过 Entry 组件的 get() 方法获得该字符串。