有些Widget控件在执行时会更改内容: 文本框(Entry)、选项按钮(Radio button)等。
有些控件我们可以更改它们的内容: 标签(Label)等。
如果想要更改它们的内容可以使用这些控件的参数,例如,textvariable、variable、onvalue等。
不过要将Widget控件的参数以变量方式处理时,需要借助tkinter模块内的变量类别(Variable Classes)
这个类别有4个子类别,每一个类别其实是一个数据类型的构造方法,可以通过这4个子类别的数据类型将它们与Widget控件的相关参数结合。
可以使用get( )方法取得变量内容,使用set( )方法设置变量内容。
例子: 单击hit按钮可以显示内容,再次单击隐藏内容
from tkinter import *
def btn_hit():
if x.get() == "":
msg_on = True
x.set("wkk")
else:
x.set("")
root = Tk()
root.title("demo")
x = StringVar()
label = Label(root,textvariable=x,width=25,height=2)
label.pack()
btn = Button(root,text="hit",command=btn_hit)
btn.pack()
root.mainloop()
可以利用变量设置追踪Widget控件,当其内容更改时,让程序执行callback函数
例子: 当Entry内容改变时,在窗口输出"wkk"
from tkinter import *
def callback(*args):
print("wkk")
root = Tk()
root.title("demo")
xE= StringVar()
entry = Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callback) # 有改变则执行callback
root.mainloop()
模式:
当控件内容被读取时,执行追踪并执行特定函数
例子: 在Entry中输入数据时,Label同步显示,如果单击了读取按钮,系统将发出数据被读取的警告
from tkinter import *
def callbackW(*args):
xL.set(xE.get()) # 同步显示
def callbackR(*args):
print("Warnning:数据被读取")
def hit():
print("读取数据:",xE.get())
root = Tk()
root.title("demo")
xE= StringVar()
entry = Entry(root,textvariable=xE)
entry.pack(padx = 10,pady = 5)
xE.trace("w",callbackW)
xE.trace("r",callbackR)
xL = StringVar()
label = Label(root,textvariable=xL)
xL.set("同步显示")
label.pack(padx = 10,pady = 5)
btn = Button(root,text="hit",command=hit)
btn.pack(pady= 5)
root.mainloop()
模式:
def callbackW(*args):
实际上是传递三个参数,分别是tk变量名称、index索引、mode模式。
目前有关tk变量名称和index索引部分尚未完成实际支持
第三个参数可以列出是r或w模式
由于所设计的程序并不需要传递参数,所以可以直接用“*args”当作参数内容
例子: 列出trace() 方法所调用的callback() 方法的参数
from tkinter import *
def callbackW(name,index,mode):
xL.set(xE.get())
print("name,index,mode = " + name +","+str(index)+","+ mode )
root = Tk()
root.title("demo")
xE = StringVar()
xL = StringVar()
entry = Entry(root,textvariable=xE)
entry.pack(padx=10,pady=5)
label = Label(root,textvariable=xL)
label.pack(padx = 10,pady = 5)
xL.set("同步显示")
xE.trace("w",callbackW)
root.mainloop()
在按钮设计时大量使用Lambda,用Lambda可以简化设计
from tkinter import *
def calculate():
result = eval(equ.get())
equ.set(equ.get() + "=\n" + str(result))
def show(buttonString):
content = equ.get()
if content == "0":
content = ""
equ.set(content + buttonString)
def backspace():
content = equ.get()
if len(content) == 1:
content = "0"
else:
content = content[:-1]
equ.set(content)
def clear():
equ.set("0")
root = Tk()
root.title("calc")
equ = StringVar()
equ.set("0")
#设计控件
label = Label(root,width = 25, height = 2, relief="raised",anchor = SE,textvariable = equ)
label.grid(row=0,column = 0,columnspan = 4,padx = 5,pady = 5)
# 清除按钮
clearBtn = Button(root,text="cls",fg = "blue",width = 5, command = clear)
clearBtn.grid(row = 1, column = 0)
#其他按键
Button(root,text="DEL",width = 5, command=backspace).grid(row=1,column= 1)
Button(root,text="%",width = 5, command=lambda: show("%")).grid(row=1,column= 2)
Button(root,text="/",width = 5, command=lambda: show("/")).grid(row=1,column= 3)
Button(root,text="7",width = 5, command=lambda: show("7")).grid(row=2,column= 0)
Button(root,text="8",width = 5, command=lambda: show("8")).grid(row=2,column= 1)
Button(root,text="9",width = 5, command=lambda: show("9")).grid(row=2,column= 2)
Button(root,text="*",width = 5, command=lambda: show("*")).grid(row=2,column= 3)
Button(root,text="4",width = 5, command=lambda: show("4")).grid(row=3,column= 0)
Button(root,text="5",width = 5, command=lambda: show("5")).grid(row=3,column= 1)
Button(root,text="6",width = 5, command=lambda: show("6")).grid(row=3,column= 2)
Button(root,text="-",width = 5, command=lambda: show("-")).grid(row=3,column= 3)
Button(root,text="1",width = 5, command=lambda: show("1")).grid(row=4,column= 0)
Button(root,text="2",width = 5, command=lambda: show("2")).grid(row=4,column= 1)
Button(root,text="3",width = 5, command=lambda: show("3")).grid(row=4,column= 2)
Button(root,text="+",width = 5, command=lambda: show("+")).grid(row=4,column= 3)
Button(root,text="0",width = 5, command=lambda: show("0")).grid(row=5,column= 0,columnspan = 2)
Button(root,text=".",width = 5, command=lambda: show(".")).grid(row=5,column= 2)
Button(root,text="=",width = 5, command=calculate).grid(row=5,column= 3)
root.mainloop()