• 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    追踪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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    模式:

    • 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    模式:

    • r当执行读取时,自动执行回调函数
    callback方法参数
    def callbackW(*args):
    
    • 1

    实际上是传递三个参数,分别是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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    在这里插入图片描述

  • 相关阅读:
    云计算的一些常见安全风险
    融合Sin混沌和分段权值的阿基米德优化算法-附代码
    2021年PHP-Laravel面试题问卷题 答案记录
    Selenium+Python自动化测试环境搭建
    Linux·工作队列
    java-net-php-python-ssh电动车销售系统计算机毕业设计程序
    短视频矩阵系统源码开发分享
    程序员保密协议
    新手学习:ArcGIS对shp文件裁剪
    linux中的lsof命令简介
  • 原文地址:https://blog.csdn.net/first_bug/article/details/127130956