Radiobutton组件
Radiobutton组件跟Checkbutton组件的用法基本一致,唯一不同的是Radiobutton实现的是“单选”的效果。
要实现这种互斥的效果,同组内的所有Radiobutton只能共享一个variable选项,并且需要设置不同的value选项值。
注释掉的也是一种方法
import tkinter as tk
root = tk.Tk()
v=tk.IntVar()
#tk.Radiobutton(root,text="One",variable=v,value=1).pack(anchor=tk.W)
#tk.Radiobutton(root,text="Two",variable=v,value=2).pack(anchor=tk.W)
#tk.Radiobutton(root,text="Three",variable=v,value=3).pack(anchor=tk.W)
texts=["One","Two","Three"]
i=1
for text in texts:
tk.Radiobutton(root,text=text,variable=v,value=i).pack(anchor=tk.W)
i+=1
tk.mainloop()
------------------------------------------------------------------------
import tkinter as tk
root = tk.Tk()
v=tk.IntVar()
v.set(1)
#set的括号里是1的话,一开始的默认选项在1;括号里是2的话,默认选项在2;如果超过了4,则没有默认选项
langs = [("One",1),("Two",2),("Three",3)]
for lang,num in langs:
tk.Radiobutton(root,text=lang,variable=v,value=num).pack(anchor=tk.W)
tk.mainloop()
也可以把前面的小圆圈换成按钮的形式
#在for循环进行改动
for text in texts:
tk.Radiobutton(root,text=text,variable=v,value=i,indicatoron=False).pack(fill=tk.X)
i+=1
LabelFrame组件
LabelFrame组件是Frame框架的进化版,从形态上来说,也就是添加了Label的Frame,有了它,Checkbutton和Radiobutton的组件分组就变得简单了;
import tkinter as tk
root = tk.Tk()
group = tk.LabelFrame(root,text="最好的脚本语言是?",padx=5,pady=5)
group.pack(padx=10,pady=10)
langs=[("python",1),("Perl",2),("Ruby",3),("Lua",4)]
v=tk.IntVar()
v.set(2)
for lang,num in langs:
b=tk.Radiobutton(group,text=lang,variable=v,value=num)
b.pack(anchor=tk.W)
#print(lang," ",num," ",v)
tk.mainloop()
Entry组件
Entry组件就是平时所说的输入框。
import tkinter as tk
root = tk.Tk()
#Tkinter总共提供三种布局组件的方法:pack(),grid()和place()
#grid()允许你用表格的形式来管理组件的位置
#row选项代表行,column选项代表列
#例如row=1,column=2表示第二行第三列
photo = tk.PhotoImage(file="E:\\GUI\\background.gif")
tk.Label(root,text="作品:").grid(row=0)
tk.Label(root,text="作者:").grid(row=1)
e1=tk.Entry(root)
e2=tk.Entry(root)
e1.grid(row=0,column=1,padx=15,pady=15)
e2.grid(row=1,column=1,padx=15,pady=15)#该处可以调节窗口大小
def show():
print("作品《%s》"% e1.get())
print("作者:%s"% e2.get())
e1.delete(0,tk.END)
e2.delete(0,tk.END)#在点击获取信息后会清空
#如果表格大于组件,那么可以使用sticky选项来设置组件的位置
#同样需要使用N,E,S,W以及它们的组合NE,SE,SW,NW
tk.Button(root,text="获取信息",width=10,command=show)\
.grid(row=2,column=0,sticky=tk.W,padx=10,pady=5)
tk.Button(root,text="退出",width=10,command=root.quit)\
.grid(row=2,column=1,sticky=tk.E,padx=10,pady=5)
tk.mainloop()
可以不停的点击获取信息,直到点击退出为止
如果想要设置一个密码框,即使用“ * ”代替输入的内容,只需要设置show选项即可
import tkinter as tk
root = tk.Tk()
#Tkinter总共提供三种布局组件的方法:pack(),grid()和place()
#grid()允许你用表格的形式来管理组件的位置
#row选项代表行,column选项代表列
#例如row=1,column=2表示第二行第三列
tk.Label(root,text="账号:").grid(row=0)
tk.Label(root,text="密码:").grid(row=1)
v1=tk.StringVar()
v2=tk.StringVar()
e1=tk.Entry(root,textvariable=v1)
e2=tk.Entry(root,textvariable=v2,show="*")
'''
e1=tk.Entry(root)
e2=tk.Entry(root,show="*")
'''
e1.grid(row=0,column=1,padx=15,pady=15)
e2.grid(row=1,column=1,padx=15,pady=15)#该处可以调节窗口大小
def show():
print("账号: %s"% v1.get())
print("密码: %s"% v2.get())
e1.delete(0,tk.END)
e2.delete(0,tk.END)#在点击获取信息后会清空
'''
def show():
print("账号: %s"% e1.get())
print("密码: %s"% e2.get())
e1.delete(0,tk.END)
e2.delete(0,tk.END)#在点击获取信息后会清空
'''
#如果表格大于组件,那么可以使用sticky选项来设置组件的位置
#同样需要使用N,E,S,W以及它们的组合NE,SE,SW,NW
tk.Button(root,text="获取信息",width=10,command=show)\
.grid(row=2,column=0,sticky=tk.W,padx=10,pady=5)
tk.Button(root,text="退出",width=10,command=root.quit)\
.grid(row=2,column=1,sticky=tk.E,padx=10,pady=5)
tk.mainloop()
另外,Entry组件还支持验证输入内容的合法性。(要求输入的是数字,输入字母就是“非法的”)。
实现该功能可以通过:validate,validatecommand,invalidecommmand。
首先用验证的开关是:validate选项。
下表是validate选项可以设置的值
'focus' | 当Entry组件获得或失去焦点时验证 |
'focusin' | 当Entry组件获得焦点的时候验证 |
'focusout' | 当Entry组件失去焦点的时候验证 |
'key' | 当输入框被编辑的时候验证 |
'all' | 当出现上面任何一种情况的时候验证 |
'none' | 关闭验证功能。默认设置该选项 |
其次是validatecommand选项指定一个验证函数,该函数只能返回True或者False表示验证结果。
最后是invalidatecommand选项指定的函数只有在validatecommmand的返回值为False时才会执行。
import tkinter as tk
root = tk.Tk()
def test():
if e1.get() == "小甲鱼":
print("正确")
return True
else:
print("错误")
e1.delete(0,END)
return False
v = tk.StringVar()
e1 = tk.Entry(root,textvariable=v,validate="focusout",validatecommand=test)
e2 = tk.Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
tk.mainloop()
Tkinter为验证函数提供了一些额外的选项
'%d' | 0表示删除操作;1表示插入操作;2表示获得、失去焦点或textvariable变量的值被修改 |
'%i' | 当用户尝试删除或插入操作时,该选项表示插入或删除的位置(索引号) 如果是由于获得、失去焦点或textvariable变量的值被修改而调用验证函数,那么该值是-1 |
'%P' | 当输入框的值允许改变的时候,该值有效 该值为输入框的最新文本内容 |
'%s' | 该值为调用验证函数前输入框的文本内容 |
'%S' | 当插入或删除操作触发验证函数的时候,该值有效 该选项表示文本被插入和删除的内容 |
'%v' | 该组件当前的validate选项值 |
'%V' | 调用验证函数的原因 该值是'focusin','focusout','key',或'forced'中的一个 |
'%W' | 组件的名字 |
import tkinter as tk
root = tk.Tk()
v=tk.StringVar()
def test(content,reason,name):
if content == "小甲鱼":
print("RIGHT!")
print(content,reason,name)
return True
else:
print("WRONG!")
print(content,reason,name)
return False
testCMD = root.register(test)
e1 = tk.Entry(root,textvariable=v,validate="focusout",validatecommand=(testCMD,"%P","%v","%W"))
e2 = tk.Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
tk.mainloop()