tkinter: 变量类别

变量类别

基本概念

有些Widget控件在执行时会更改内容: 文本框(Entry)、选项按钮(Radio button)等。

有些控件我们可以更改它们的内容: 标签(Label)等。

如果想要更改它们的内容可以使用这些控件的参数,例如,textvariable、variable、onvalue等。

不过要将Widget控件的参数以变量方式处理时,需要借助tkinter模块内的变量类别(Variable Classes)

这个类别有4个子类别,每一个类别其实是一个数据类型的构造方法,可以通过这4个子类别的数据类型将它们与Widget控件的相关参数结合。

  • x = IntVar() 整型,默认0
  • x=DoubleVar(),浮点型,默认0.0
  • x=StringVar(), 字符串型,默认""
  • x=BooleanVar(), 布尔类型,True是1, False是0
get()和set()

可以使用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()
追踪trace()
模式w

可以利用变量设置追踪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()

模式:

  • w 执行写入时,自动执行回调函数
模式r

当控件内容被读取时,执行追踪并执行特定函数

例子: 在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()

模式:

  • r当执行读取时,自动执行回调函数
callback方法参数
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()

在这里插入图片描述

demo - 简易计算器

在按钮设计时大量使用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()

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值