Tkinter : LabelFrame组件,Entry组件

LabelFrame

这个时 Frame 组件的变体,默认情况下, labelframe 会在其组件的周围绘制一个边框以及一个标题。就是添加了label 的 frame ,但有了它 checkbutton and radiobutton 的分组就变得很简单。

在这里插入图片描述
与frame 组件的参数相比多了下面这些 frame组件

  • labelanchor
  1. 控制文本在 LabelFrame 的显示位置
  2. “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或 “center” 来定位(ewsn代表东西南北,上北下南左西右东)
  3. 默认值是 NW
  • labelwidget
  1. 指定一个组件替代默认的文本 Label
  2. 如果同时设置此选项和 text 选项,则忽略 text 选项的内容

Entry

输入框组件,这个仅允许输入一行文本,如果超过了会自动滚动,

在这里插入图片描述

获取输入框中的内容

grid 网格布局的方法,选项 row 表示 行,column 表示 列。

root=tk.Tk()
root.title('小姐姐交个朋友啊!!!')
tk.Label(root,text='QQ:').grid(row=0,column=0)
tk.Label(root,text='微信:').grid(row=1,column=0)

e1=tk.Entry(root)
e2=tk.Entry(root)
e1.grid(row=0,column=1,padx=10,pady=5)
e2.grid(row = 1, column = 1, padx = 10, pady = 5)

def show():
    print('小姐姐的QQ是:',e1.get())
    print('小姐姐的微信是:',e2.get())
    
tk.Button(root, text = "好啊!", width = 10, command = show).grid(row = 3, column = 0, sticky = "w", padx = 10, pady = 5)
tk.Button(root, text = '想得美!!', width = 10, command = root.quit).grid(row = 3, column = 1, sticky = "e", padx = 10, pady = 5)  #退出就直接调用窗口的 quit() 方法 
 
root.mainloop()

在这里插入图片描述
当你用 IDLE 时,使用 root.quit 就会发生冲突,,IDLE 也是 tkinter 写出来的嘛。。可以用 pycham 或者用窗口直接运行这个程序。

sticky 用法: 如果表格大于组件,用这个来设置组件的位置

  1. 控制组件在 grid 分配的空间中的位置

  2. 可以使用 “n”, “e”, “s”, “w” 以及它们的组合来定位(ewsn代表东西南北,上北下南左西右东)

  3. 使用加号(+)表示拉长填充,例如 “n” + “s” 表示将组件垂直拉长填充网格,“n” + “s” + “w” + “e” 表示填充整个网格

  4. 不指定该值则居中显示

使用 * 来代替你输入的实际内容

show 用法

  1. 设置输入框如何显示文本的内容
  2. 如果该值非空,则输入框会显示指定字符串代替真正的内容
  3. 将该选项设置为 “*”,则是密码输入框(这是什么字符,就以什么字符代替)
import tkinter as tk

root=tk.Tk()
root.title('小姐姐交个朋友啊!!!')
tk.Label(root,text='QQ:').grid(row=0,column=0)
tk.Label(root,text='微信:').grid(row=1,column=0)

v1=tk.StringVar()       # 这里使用另一种方法接收输入的内容
v2=tk.StringVar()

e1=tk.Entry(root,textvariable=v1)
e2=tk.Entry(root,textvariable=v2,show='*')        # 改变输入的样式
e1.grid(row=0,column=1,padx=10,pady=5)
e2.grid(row = 1, column = 1, padx = 10, pady = 5)

def show():
    print('小姐姐的QQ是:',v1.get())        # 这里直接获得 v1 这个变量就行
    print('小姐姐的微信是:',v2.get())
    
tk.Button(root, text = "好啊!", width = 10, command = show).grid(row = 3, column = 0, sticky = 'e'+'w', padx = 10, pady = 5)
tk.Button(root, text = '想得美!!', width = 10, command = root.quit).grid(row = 3, column = 1, sticky = "e"+'w', padx = 10, pady = 5)  #退出就直接调用窗口的 quit() 方法 
 
root.mainloop()

验证输入内容的合法性

就要求输入的是数字,否则就是非法,实现该功能,设置 validate,validatecommand and invalidcommand 三个选项

首先启用验证的开关就是 validata 选项:

validate可以设置的值 含义
focus 当Entry 组件获得或失去焦点的时候验证
focusin 获得焦点的时候验证
focusout 失去焦点的时候验证
key 当输入框被编辑的时候验证
none 关闭验证功能,注意这个是字符串 ‘none’ 而不是 None
all 当出现上面任何一种情况时验证

然后为 validatecommand 选项指定一个验证函数,这个函数只返回 true 或 false 表示验证的结果。

最后 ,invalidcommand 选项指定的函数只有在函数返回 false 时,调用。

root=tk.Tk()

def text():
    if e1.get()=='nero':
        print('正确')
        return True
    else:
        print('错了')
        return False
    
def text2():
    print('你居然输入的不是 nero !!!')
    
v=tk.StringVar()
e1=tk.Entry(root,textvariable=v,validate='focusout',validatecommand=text,invalidcommand=text2)
e2=tk.Entry(root)               # 第一个框输入 nero 并换到下一行(鼠标点,或Tab ),验证触发, 如果输入正确调用text
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)

tk.mainloop()

在这里插入图片描述
Tkinter 为验证函数提供一些额外的选项:

额外选项 含义
‘%d’ 操作代码:0 表示删除操作;1 表示插入操作;2 表示获得、失去焦点或 textvariable 变量的值被修改
‘%i’ 1. 当用户尝试插入或删除操作的时候,该选线表示插入或删除的位置(索引号) 2. 如果是由于获得、失去焦点或 textvariable 变量的值被修改而调用验证函数,那么该值是 -1
‘%P’ 1. 当输入框的值允许改变的时候,该值有效 2. 该值为输入框的最新文本内容
‘%s’ 该值为调用验证函数前输入框的文本内容
‘%S’ 1. 当插入或删除操作触发验证函数的时候,该值有效 2. 该选项表示文本被插入和删除的内容
‘%v’ 该组件当前的 validate 选项的值
‘%V’ 1. 调用验证函数的原因 2. 该值是 ‘focusin’,‘focusout’,‘key’ 或 ‘forced’(textvariable 选项指定的变量值被修改)中的一个
‘%W’ 该组件的名字,不过是 tk 变量在内部注册的名字,为一串数字。
root=tk.Tk()

def text(d,i,P,s,S,v,V,W):
    if e1.get()=='nero':
        print('正确')
        print(d,i,P,s,S,v,V,W)
        return True
    else:
        print('错了')
        print(d,i,P,s,S,v,V,W)
        return False
    
def text2():
    print('你居然输入的不是 nero !!!')
    
testCMD=root.register(text)      # 要用 register 将验证函数包起来,
    
v=tk.StringVar()
e1=tk.Entry(root,textvariable=v,validate='focusout',validatecommand= (testCMD,'%d','%i','%P','%s','%S','%v','%V','%W'),invalidcommand=text2) 
# 在 validatecommand 中传入选项
e2=tk.Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)

tk.mainloop()

错了        # 我输入的是 你好啊
-1 -1 你好啊 你好啊  focusout focusout .!entry # %S 没有生效 所以只有七个值。
你居然输入的不是 nero !!!

实现一个简单的计算器

root=tk.Tk()

frame=tk.Frame(root)
frame.pack(padx=10,pady=10)

v1=tk.StringVar()
v2=tk.StringVar()
v3=tk.StringVar()

def test(content):
    if content.isdigit() or content=='':
        return True
    else:
        return False
    
testCMD=root.register(test)
tk.Entry(frame,textvariable=v1,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=0)
tk.Label(frame,text='+').grid(row=0,column=1)

tk.Entry(frame,textvariable=v2,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=2)
tk.Label(frame,text='=').grid(row=0,column=3)

tk.Entry(frame,textvariable=v3,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=4)

def calc():
    result=int(v1.get())+int(v2.get())
    v3.set(result)

tk.Button(frame,text='计算',command=calc).grid(row=1,column=2,pady=5)

tk.mainloop()

在这里插入图片描述

参数

大部分的参数还是差不多的。。。

选项 含义
exportselection 1. 指定选中的文本是否可以被复制到剪贴板 2. 默认值是 True 3. 可以修改为 False 表示不允许复制文本
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 一样
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 避免焦点在此输入框中
textvariable 1. 指定一个与输入框的内容相关联的 Tkinter 变量(通常是 StringVar) 2. 当输入框的内容发生改变时,该变量的值也会相应发生改变
validate 1. 该选项设置是否启用内容验证 2. 详见本内容最下方小甲鱼关于验证详解
validatecommand 1. 该选项指定一个验证函数,用于验证输入框内容是否合法 2. 验证函数需要返回 True 或 False 表示验证结果 3. 注意,该选项只有当 validate 的值非 “none” 时才有效 3. 详见本内容最下方小甲鱼关于验证详解
vcmd 跟 validatecommand 一样
xscrollcommand 1. 与 scrollbar(滚动条)组件相关联 2. 如果你觉得用户输入的内容会超过该组件的输入框宽度,那么可以考虑设置该选项 3. 使用方法可以参考: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 是鼠标当前的水平位置),然后再将 事件绑定到 scan_dragto(x) 方法(x 是鼠标当前的水平位置),就可以实现输入框在当前位置和 sacn_mack(x) 指定位置之间的水平滚动

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 表示一页)

wdm。。。那些大牛是怎么记的,,,我感觉学了就忘。。。。

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106564238
今日推荐