跳过正文
  1. 文章/
  2. Python/
  3. GUI/
  4. Tkinter/

4、输入框Entry

·2930 字·6 分钟· loading · loading · ·
Python GUI Tkinter
GradyYoung
作者
GradyYoung
Tkinter - 点击查看当前系列文章
§ 4、输入框Entry 「 当前文章 」

获取用户输入信息

from pydoc import text
import tkinter as tk

root = tk.Tk()

# 创建 username 的标签和输入框,并配置布局
u_lable = tk.Label(root,text="用户名:")
u_lable.grid(row=0, column=0, sticky= tk.W)
u_entry = tk.Entry(root)
u_entry.grid(row = 0, column = 1, sticky = tk.E)

# 创建 password 的标签和输入框,并配置布局
p_lable = tk.Label(root,text="密码:")
p_lable.grid(row=1,column=0,sticky= tk.W)
p_entry = tk.Entry(root)
p_entry.grid(row = 1, column = 1, sticky = tk.E)
p_entry['show'] = '*' # 密码输入框,所以将所有的输入内容显示为星号

# 登录方法
def login():
    username = u_entry.get()
    password = p_entry.get()
    print(f'username:{username},password:{password}')

# 创建登录按钮
login_btn = tk.Button(root,text='登录',command=login)
login_btn.grid(row=2)

root.mainloop()

属性
#

选项 含义
background 1. 设置 Entry 的背景颜色 ;2. 默认值由系统指定
bg 跟 background 一样
borderwidth 1. 设置 Entry 的边框宽度 ;2. 默认值是 1 或 2 像素
bd 跟 borderwidth 一样
cursor 1. 指定当鼠标在 Entry 上飘过的时候的鼠标样式 ;2. 默认值由系统指定
exportselection 1. 指定选中的文本是否可以被复制到剪贴板 ;2. 默认值是 True ;3. 可以修改为 False 表示不允许复制文本
font 1. 指定 Entry 中文本的字体 ;2. 默认值由系统指定
foreground 1. 设置 Entry 的文本颜色; 2. 默认值由系统指定
fg 跟 foreground 一样
highlightbackground 1. 指定当 Entry 没有获得焦点的时候高亮边框的颜色 ;2. 默认值由系统指定
highlightcolor 1. 指定当 Entry 获得焦点的时候高亮边框的颜色 ;2. 默认值由系统指定
highlightthickness 1. 指定高亮边框的宽度 ;2. 默认值是 1 或 2 像素
insertbackground 指定输入光标的颜色
insertborderwidth 1. 指定输入光标的边框宽度; 2. 如果被设置为非 0 值,光标样式会被设置为 RAISED ;3.将 insertwidth 设置大一点才能看到效果哦
insertofftime 1. 该选项控制光标的闪烁频率(灭) ;2. 单位是毫秒
insertontime 1. 该选项控制光标的闪烁频率(亮) ;2. 单位是毫秒
insertwidth 1. 指定光标的宽度 ;2. 默认值是 1 或 2 像素
invalidcommand 1. 指定当输入框输入的内容“非法”时调用的函数 ;2. 也就是指定当 validateCommand 选项指定的函数返回 False 时的函数 ;3. 详见本内容最下方小甲鱼关于验证详解
invcmd 跟 invalidcommand 一样
justify 1. 定义如何对齐输入框中的文本 ;2. 使用 “left”,“right” 或 “center” ;3. 默认值是 “left”
relief 1. 指定边框样式 ;2. 默认值是 “sunken” ;3. 其他可以选择的值是 “flat”,“raised”,“groove” 和 “ridge”
selectbackground 1. 指定输入框的文本被选中时的背景颜色 ;2. 默认值由系统指定
selectborderwidth 1. 指定输入框的文本被选中时的边框宽度(选中边框) ;2. 默认值由系统指定
selectforeground 1. 指定输入框的文本被选中时的字体颜色 ;2. 默认值由系统指定
show 1. 设置输入框如何显示文本的内容; 2. 如果该值非空,则输入框会显示指定字符串代替真正的内容 ;3. 将该选项设置为 “*",则是密码输入框
state 1. Entry 组件可以设置的状态:“normal”,“disabled” 或 “readonly”(注意,它跟 “disabled” 相似,但它支持选中和拷贝,只是不能修改,而 “disabled” 是完全禁止) ;2. 默认值是 “normal” ;3.注意,如果此选项设置为 “disabled” 或 “readonly”,那么调用 insert() 和 delete() 方法都会被忽略
takefocus 1. 指定使用 Tab 键可以将焦点移动到输入框中 ;2. 默认是开启的,可以将该选项设置为 False 避免焦点在此输入框中
extvariable 1. 指定一个与输入框的内容相关联的 Tkinter 变量(通常是 StringVar) ;2. 当输入框的内容发生改变时,该变量的值也会相应发生改变
validate 1. 该选项设置是否启用内容验证
validatecommand 1. 该选项指定一个验证函数,用于验证输入框内容是否合法 ;2. 验证函数需要返回 True 或 False 表示验证结果 3. 注意,该选项只有当 validate 的值非 “none” 时才有效
vcmd 跟 validatecommand 一样
width 1. 设置输入框的宽度,以字符为单位 ;2. 默认值是 20 ;3. 对于变宽字体来说,组件的实际宽度等于字体的平均宽度乘以 width 选项的值
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联 ;2. 如果你觉得用户输入的内容会超过该组件的输入框宽度,那么可以考虑设置该选项

方法
#

  • 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() 方法获得该字符串。

然后,invalidcommand 选项指定的函数只有在 validatecommand 的返回值为 False 的时候才被调用。

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

Spinbox
#

Spinbox 组件(Tk8.4 新增)是Entry 组件的变体,用于从一些固定的值中选取一个。

import tkinter as tk
 
root = tk.Tk()
 
w = tk.Spinbox(root, from_=0, to=10)
w.pack()
 
root.mainloop()

image-20250415144924868

还可以通过元组指定允许输入的值

import tkinter as tk
 
root = tk.Tk()
 
w = tk.Spinbox(root, values= ("小新", "风间", "正男", "妮妮", "阿呆"))
w.pack()
 
root.mainloop()

image-20250415145007453

Tkinter - 点击查看当前系列文章
§ 4、输入框Entry 「 当前文章 」