Python |Entry组件—创造输入框

本篇文章转载于鱼C论坛
详情请点击:
[https://fishc.com.cn/forum.php?mod=viewthread&tid=59443&extra=page%3D1%26filter%3Dtypeid%26typeid%3D604]

Entry(输入框)组件通常用于获取用户的输入文本。

何时使用 Entry 组件?

Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示空间更长,那内容将被滚动。这意味着该字符串将不能被全部看到(你可以用鼠标或键盘的方向键调整文本的可见范围)。

如果你希望接收多行文本的输入,可以使用 Text 组件。

用法

使用代码为 Entry 组件添加文本,可以使用 insert() 方法。如果要替换当前文本,可以先使用 delete() 方法,再使用 insert() 方法实现:

from tkinter import *

master = Tk()

e = Entry(master)
e.pack(padx=20, pady=20)

e.delete(0, END)
e.insert(0, "默认文本...")

mainloop()

在这里插入图片描述
获取当前输入框的文本,可以使用 get() 方法:

s = e.get()

你也可以绑定 Entry 组件到 Tkinter 变量(StringVar),并通过该变量设置和获取输入框的文本:

v = StringVar()
e = Entry(master, textvariable=v)
e.pack()

v.set("I love FishC.com!")
s = v.get()

下边的例子演示将 Entry 组件和 Button 组件配合,点击“获取信息”按钮时自动清空输入框并将内容输出

from tkinter import *

master = Tk()

Label(master, text="作品:").grid(row=0)
Label(master, text="作者:").grid(row=1)

e1 = Entry(master)
e2 = 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)

Button(master, text="获取信息", width=10, command=show).grid(row=3, column=0, sticky=W, padx=10, pady=5)
Button(master, text="退出", width=10, command=master.quit).grid(row=3, column=1, sticky=E, padx=10, pady=5)

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 是鼠标当前的水平位置),然后再将 事件绑定到 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 选项,该选项可以设置的值有:
在这里插入图片描述

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

下边的例子中,在第一个输入框输入“小甲鱼”并通过 Tab 键将焦点转移到第二个输入框的时候,验证功能被成功触发:

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)
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()

在这里插入图片描述
然后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。

下边的例子中,在第一个输入框输入“小鱿鱼”,并通过 Tab 键将焦点转移到第二个输入框,validatecommand 指定的验证函数被触发并返回 False,接着 invalidcommand 被触发:

from tkinter import *

master = Tk()

v = StringVar()

def test1():
    if v.get() == "小甲鱼":
        print("正确!")
        return True
    else:
        print("错误!")
        e1.delete(0, END)
        return False

def test2():
    print("我被调用了......")
    return True

e1 = Entry(master, textvariable=v, validate="focusout", validatecommand=test1, invalidcommand=test2)
e2 = Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)

mainloop()
  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值