控件之notebook radiobutton checkbutton variable compound

#组件数值改变需要用variable绑定,组件文本改变用textvariable绑定;值显示用value,文本显示用text

1.tkinter 支持将很多 GUI 组件与变量进行双向绑定,执行这种双向绑定后编程非常方便:
        如果程序改变变量的值,GUI 组件的显示内容或值会随之改变;
        当 GUI 组件的内容发生改变时(比如用户输入),变量的值也会随之改变;

2.但这种双向绑定有一个限制,就是 Tkinter不允许将组件和普通变量进行绑定,
只能和 tkinter 包下 Variable 类的子类进行绑定。该类包含如下几个子类:
        StringVar():用于包装str 值的变量。
        IntVar():用于包装整型值的变量。
        DoubleVar():用于包装浮点值的变量。
        BooleanVar():用于包装bool值的变量。

3.对于 Variable 变量而言,如果要设置其保存的变量值,则使用它的 set() 方法;
如果要得到其保存的变量值,则使用它的 get() 方法。

4.variable主要参数有:variable, textvariable, onvalue, offvalue, value

程序可以为按钮或 Label 等组件同时指定 text 和 image 两个选项,其中 text 用于指定该组件上的文本;
image 用于显示该组件上的图片,当同时指定这两个选项时,通常 image 会覆盖 text。
但在某些时候,程序希望该组件能同时显示文木和图片,此时就需要通过 compound 选项进行控制。

compound 选项支持如下属性值:
None:图片覆盖文字。
LEFT 常量(值为‘left’字符串):图片在左,文本在右。
RIGHT 常量(值为‘right’字符串):图片在右,文本在左。
TOP 常量(值为‘top’字符串): 图片在上,文本在下。
BOTTOM 常量(值为‘bottom’字符串):图片在底,文本在上。
CENTER 常量(值为‘center’字符串):文本在图片上方。
from tkinter import *
from tkinter import messagebox
from tkinter import ttk

root = Tk()
root.title('Radiobutton Checkbutton Variable')
root.resizable(0,0)

#创建Notebook
tabControl = ttk.Notebook(root)  #窗口下创建Notebook
tabControl.pack(expand=1, fill="both")  # 添加notebook,窗口显示

tab1 = Frame(tabControl)  # notebook下创建frame
tabControl.add(tab1, text='Variable')  # 添加frame到notebook显示

tab2 = Frame(tabControl)  # Add a second tab
tabControl.add(tab2, text='compound')  # Make second tab visible

tab3 = Frame(tabControl)
tabControl.add(tab3, text='第三页')

#-------------- 创建variable控件-----------------
#Button textvariable:
leftf1 =Frame(tab1)
leftf1.pack(side=LEFT,pady=20,padx=5)



def change1():
    import random
    strVar1.set(books1[random.randint(0, 2)])#调用set

def get1():
    messagebox.showinfo(title='文本变量',message=strVar1.get())#调用get

strVar1 = StringVar()#创建变量
books1 = ('Python', 'C', 'C++')
# 绑定变量
Entry(leftf1, textvariable=strVar1,width=10,font=('楷体', 20, 'bold'),fg='red').pack(pady=10 )
Button(leftf1, text='改变', command=change1).pack(side=LEFT,fill=X,expand=1,pady=10)
Button(leftf1, text='获取', command=get1).pack(side=LEFT,fill=X,expand=1,pady=10)

#Radiobutton IntVar:
leftf2 =Frame(tab1)
leftf2.pack(side=LEFT)

def change2():
    messagebox.showinfo(title='整形变量', message=intVar1.get())#调用get

intVar1 = IntVar()#创建变量
books2 = ('C','C++', 'Python', 'Java')
i = 1
for book2 in books2:#绑定变量,相当于创建四个radiobutton,并绑定变量和value=(0-3)值

    Radiobutton(leftf2,text=book2,variable=intVar1, value=i,command=change2).pack(anchor=W)
    i += 1
intVar1.set(2)#调用set

'''i从0开始
intVar1 = IntVar()
for i,book2 in enumerate(('C','C++', 'Python', 'Java')):
    Radiobutton(leftf2,text=book2,variable=intVar1, value=i,command=change2).pack(anchor=W)
intVar1.set(2)#调用set
'''


#checkbutton BooleanVar:
leftf3 =Frame(tab1)
leftf3.pack(side=LEFT)

def change3():
    # e.get()用来获取checkbutton选中与否状态的返回值:onvalue或offvalue的值,默认是1,0,要变为str:True
    newbooknums3 = [str(booknum3.get()) for booknum3 in booknums3]##步骤3调用get()
    # join():连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
    Nbn = ', '.join(newbooknums3)
    messagebox.showinfo(title='布尔变量', message=Nbn)

books3 = ('C','C++', 'Python', 'Java')
booknums3 = []
for book3 in books3:
    booleanVar2 = BooleanVar()  #步骤1创建
    Checkbutton(leftf3, text=book3, variable=booleanVar2, command=change3).pack(anchor=W)#步骤2绑定
    booknums3.append(booleanVar2)

# 输出PY_VAR2-PY_VAR5是个地址引用,var 是对 tkinter.IntVar 对象的引用,您需要调用其 get 方法访问它代表的值:
    print (booleanVar2)
print(booknums3)#打印列表元素的地址

#checkbutton StringVar:
leftf4 =Frame(tab1)
leftf4.pack(side=LEFT)

def change4():
    # e.get()用来获取checkbutton选中与否状态的返回值:onvalue或offvalue的值
    newlist = [e.get() for e in books]
    # 将new_li列表连接成字符串
    st = ', '.join(newlist)
    messagebox.showinfo(title='字符串变量', message=st)

books = []
books4 = ('C','C++', 'Python', 'Java')
vals = ('C','C++', 'Python', 'Java')
i = 0

for book4 in books4:
    strVar4 = StringVar()
    #ttk.checkbutton与checkbutton样式不一样
    cb = ttk.Checkbutton(leftf4,text=book4,variable=strVar4,
                         onvalue=vals[i],#onvalue默认等于1,offvalue默认等于0
                         offvalue='无',
                         command=change4)
    cb.pack(anchor=W)
    books.append(strVar4)
    strVar4.set(vals[i])#设置初始状态,也可strVar4.set('无')
    i += 1


# -------------- 创建compound控件-----------------

bm = PhotoImage(file = 'C:/Users/caojiangtao/Desktop/3.compound.png')
label = Label(tab2, text='学编程\n神器',image=bm,font=('楷体', 20, 'bold'), foreground='red' )
label.pack()

f = ttk.Frame(tab2)
f.pack(fill=BOTH, expand=YES)

def compoundchange():
    b = label['compound'] = strVar5.get().lower()# lower() 方法转换字符串中所有大写字符为小写。
    print(b)
    
strVar5 = StringVar()
compounds = ('None', "LEFT", "RIGHT", "TOP", "BOTTOM", "CENTER")
for value in compounds:
    rb = Radiobutton(f,text=value,variable=strVar5,value=value,command=compoundchange,padx=10)
    rb.pack(side=LEFT, anchor=CENTER)

strVar5.set('None')

root.mainloop()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值