LabelFrame
这个时 Frame 组件的变体,默认情况下, labelframe 会在其组件的周围绘制一个边框以及一个标题。就是添加了label 的 frame ,但有了它 checkbutton and radiobutton 的分组就变得很简单。
与frame 组件的参数相比多了下面这些 frame组件
- labelanchor
- 控制文本在 LabelFrame 的显示位置
- “n”, “ne”, “e”, “se”, “s”, “sw”, “w”, “nw”, 或 “center” 来定位(ewsn代表东西南北,上北下南左西右东)
- 默认值是 NW
- labelwidget
- 指定一个组件替代默认的文本 Label
- 如果同时设置此选项和 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 用法: 如果表格大于组件,用这个来设置组件的位置
- 控制组件在 grid 分配的空间中的位置
- 可以使用 “n”, “e”, “s”, “w” 以及它们的组合来定位(ewsn代表东西南北,上北下南左西右东)
- 使用加号(+)表示拉长填充,例如 “n” + “s” 表示将组件垂直拉长填充网格,“n” + “s” + “w” + “e” 表示填充整个网格
- 不指定该值则居中显示
使用 * 来代替你输入的实际内容
show 用法
- 设置输入框如何显示文本的内容
- 如果该值非空,则输入框会显示指定字符串代替真正的内容
- 将该选项设置为 “*”,则是密码输入框(这是什么字符,就以什么字符代替)
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。。。那些大牛是怎么记的,,,我感觉学了就忘。。。。