【Python】Radiobutton组件 LabelFrame组件 Entry组件

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

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/81274106