#组件数值改变需要用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()