Python之tkinter 变量类别

会有一股神秘感。 提交于 2020-03-11 14:41:52

一、变量类别的基本简介

有些控件在执行时会更改内容,例如,文本框(Entry),选项按钮(Radio button)等,选项按钮就是选择按钮,多选单选啥的

有些控件我们可以更改他们的内容,例如标签(Label)等,如果想要更改他们的内容,可以使用这些控件的参数,例如,textvariablevariableonvalue

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

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

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

二、set() 方法

使用set()方法设置变量内容

import tkinter

# 控制显示的开关
msg = False
def click():
    # 改变变量
    global msg
    if msg ==False:
        msg = True
        # 设置文字
        x.set("Python!!!")
    else:
        msg = False
        # 设置空
        x.set("")

root = tkinter.Tk()
x = tkinter.StringVar()
# textvariable 是可变的,会跟随字符串变而自动变内容
label = tkinter.Label(root, textvariable=x, bg="lightyellow", fg="red", font="Verdana 18 bold", width=25, height=2)
label.pack()

button = tkinter.Button(root, text="请点击", command=click)
button.pack()

root.mainloop()

运行结果:
在这里插入图片描述

三、get() 方法

使用get()方法取得变量内容

我们可以用get()方法改良这个小程序

import tkinter

def click():
    if x.get() == "":
        x.set("Python!!!")
    else:
        x.set("")

root = tkinter.Tk()
x = tkinter.StringVar()
# textvariable 是可变的,会跟随字符串变而自动变内容
label = tkinter.Label(root, textvariable=x, bg="lightyellow", fg="red", font="Verdana 18 bold", width=15, height=2)
label.pack()

button = tkinter.Button(root, text="请点击", command=click)
button.pack()

root.mainloop()

运行结果:
在这里插入图片描述

四、追踪trace() 使用模式 w

我们可以利用变量设置追踪Widget控件,当其内容发生改变时,让程序自动执行函数

例子

import tkinter

# 这里必须要加入*args,具体下面细说
def show(*args):
    print("数据:", string.get())

root = tkinter.Tk()
string = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=string)
entry.pack(padx=5, pady=10)
string.trace("w", show)

root.mainloop()

运行结果:
在这里插入图片描述
string.trace("w", show)

  • 第一个参数是模式,w代表当有执行写入时,就自动去执行show函数
  • 也可以自行取函数名称,这个动作称为变动追踪

我们可以运用set和get方法使我们在窗口内实现同步显示

例子

import tkinter

def show(*args):
    stringLabel.set(stringEntry.get())
    print("数据:", stringEntry.get())

root = tkinter.Tk()
stringEntry = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=stringEntry)
entry.pack(padx=5, pady=10)
stringEntry.trace("w", show)

stringLabel = tkinter.StringVar()
label = tkinter.Label(root, textvariable=stringLabel)
stringLabel.set("同步显示")
label.pack(padx=5, pady=10)


root.mainloop()

运行结果:
在这里插入图片描述

五、追踪trace() 使用模式 r

我们也可以设计当控件内容被读取时,执行追踪并执行特定函数

例子

import tkinter

def show(*args):
    Tr.set(Tw.get())

def getting(*args):
    print("警告!!正在被读取数据")

def hit():
    print("数据为:", Tw.get())

root = tkinter.Tk()
Tw = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=Tw)
entry.pack(padx=5, pady=10)
Tw.trace("w", show)
Tw.trace("r", getting)

Tr = tkinter.StringVar()
label = tkinter.Label(root, textvariable=Tr)
Tr.set("同步显示")
label.pack(padx=5, pady=10)

button = tkinter.Button(root, text="点击读取", command=hit)
button.pack(padx=5, pady=10)

root.mainloop()

运行结果:
在这里插入图片描述

Tw.trace("r", getting)

  • 第一个参数是模式,r代表当有执行读取时,就自动去执行getting函数
  • 也可以自行取函数名称,这个动作称为读取追踪

六、trace() 方法调用的方法参数

def show(*args):

*args其实是传递三个参数,分别是tk变量名称index索引mode模式

不过目前有关于tk变量名称index索引部分尚未完成实际支持,第三个参数则可以列出是r还是w模式

由于我们所设计的程序并不需要传递参数,所以可以直接用*args当做参数内容

例子

import tkinter

def show(name, index, mode):
    stringLabel.set(stringEntry.get())
    print("name = %r, index = %r, mode = %r" % (name, index, mode))

root = tkinter.Tk()
stringEntry = tkinter.StringVar()
entry = tkinter.Entry(root, textvariable=stringEntry)
entry.pack(padx=5, pady=10)
stringEntry.trace("w", show)

stringLabel = tkinter.StringVar()
label = tkinter.Label(root, textvariable=stringLabel)
stringLabel.set("同步显示")
label.pack(padx=5, pady=10)


root.mainloop()

运行结果:
在这里插入图片描述
这里解释一下

%r

%s是将变量传到str()函数中,结果是将变量转化适合人阅读的格式

%r是将变量穿到repr()函数中,结果是将变量转化成适合机器阅读的格式,可以将%r后的变量理解为一个对象

谢谢观看,笔者会持续更新,如有错误或者建议,请私信我

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!