六、变量类别

2020-06-21  本文已影响0人  蝉时雨丶

变量类别的基本概念

有些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()方法设置变量内容。

样例:set()方法的应用。这个程序在执行时若单击Hit按钮可以显示"I like tkinter"字符串,如果已经
显示此字符串则改成不显示此字符串。这个程序是将标签内容设为变量x,设置显示标签时的标签内容,
将标签内容设为空字符串以不显示标签内容。

from tkinter import *
def btn_hit():
global msg_on
if msg_on == False:
msg_on =True
x.set("I like tkinter")
else:
msg_on=False
x.set("")

root=Tk()
root.title("ch6_1")
''
msg_on=False
x=StringVar()
label=Label(root,textvariable=x,
fg="blue",bg="lightyellow",
font="Verdana 16 bold",
width=25,height=2)
label.pack()
btn=Button(root,text="Click Me",command=btn_hit)
btn.pack()
root.mainloop()

在上述实例中利用布尔值msg_on变量判断是否要显示"I like tkinter"字符串,如果msg_on是False表示
目前没有显示"I like tkinter"字符串,如果msg_on是True表示目前有显示"I like tkinter"字符串。当
单击Click Me按钮时,会更改msg_on状态。同时也由set()方法更改label对象的参数textariable的内容,

上述程序尽管可以运行,可以并没有使用另一个方法get(),这个方法可以取得Widget控件某参数的变量
内容,我们将使用下列程序进行改良。

重新设计,取消布尔值msg_on变量,我们可以直接由get()方法获得目前Widget控件参数内容,然后由此
内容判断是否显示"I like tkinter"字符串。判断方式是如果目前是空字符串则显示"I like tkinter",如果目前
不是空字符串,则改成显示空字符串。

from tkinter import *
def btn_hit():
if x.get() == "":
x.set("I like tkinter")
else:
x.set("")
root=Tk()
root.title("ch6_2")
''
x=StringVar()
label=Label(root,textvariable=x,
fg="blue",bg="lightyellow",
font="Verdana 16 bold",
width=25,height=2)
label.pack()

btn=Button(root,text="Click Me",command=btn_hit)
btn.pack()
root.mainloop()

追踪trace()使用模式w

我们可以利用变量设置追踪Widget控件,当其内容更改时,仍程序执行callback函数。

from tkinter import *
def callback(*args):
print("data changed :",xE.get())

root=Tk()
root.title("ch6_3")
''
xE=StringVar()
entry=Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callback)
'2124879496072callback'
root.mainloop()

当看到窗口输出时,同时可以在Python Shell窗口中同步看到输出。

xE.trace("w",callback)
上述第一个参数是模式,w代表当有执行写入时,就自动取执行callback函数。也可以
自行取函数名称,则个动作成为变动追踪。我们可以通过xE变量类别追踪Widget控件内容的
改变时执行特定动作。

扩充上述实例,同时在Entry控件下方建立Label控件,当在Entry中有输入时,同时在下方的
Label控件中显示。

from tkinter import *
def callback(*args):
xL.set(xE.get())
print("data changed :",xE.get())

root=Tk()
root.title("ch6_4")
''
xE=StringVar()
entry=Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callback)
'2124841434248callback'
xL=StringVar()
label=Label(root,textvariable=xL)
xL.set("同步显示")
label.pack(pady=5,padx=10)
root.mainloop()

追踪trace()使用模式r

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

样例:当在Entry中输入数据时Python Shell窗口不显示数据,但是下方的Label将同步显示。主要功能
是如果单击了"读取"按钮,系统将发出数据被读取的警告,同时输出所读取的内容。

from tkinter import *
def callbackW(*args):
xL.set(xE.get())

def callbackR(*args):
print("Warning:数据被读取!")

def hit():
print("读取数据:",xE.get())

root=Tk()
root.title("ch6_5")
''
xE=StringVar()
entry=Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callbackW)
'2739082486792callbackW'
xE.trace("r",callbackR)
'2739082953800callbackR'
xL=StringVar()
label=Label(root,textvariable=xL)
xL.set("同步显示")
label.pack(pady=5,padx=10)
btn=Button(root,text="读取",command=hit)
btn.pack(pady=5)
root.mainloop()

xE.trace("r",callbackR)
上述第一个参数是模式,r代表当执行读取时,就自动去执行callbackR函数。也可以自行取函数
名称,这个动作成为读取追踪。我们可以通过xE变量类别追踪Widget控件内容被读取时执行的
特定动作。

trace()方法调用的callback方法参数

def callbackW(*args):

其实是传递三个参数,分别是tk变量名称、index索引、mode模式。不过目前有关tk变量名称和
index部分尚未完成实际支持,至于第三个参数则是可以列出是r或w模式。由于我们所设计的程序
并不需要传递参数,所以可以直接用"*args"当作参数内容。

样例:列出trace()方法所调用callbackI()方法内的参数。

from tkinter import *
def callbackW(name,index,mode):

xE.trace("w",callback)
'2124841434248callback'
>>> xL=StringVar()
>>> label=Label(root,textvariable=xL)
>>> xL.set("同步显示")
>>> label.pack(pady=5,padx=10)
>>> root.mainloop()

#追踪trace()使用模式r

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

样例:当在Entry中输入数据时Python Shell窗口不显示数据,但是下方的Label将同步显示。主要功能
是如果单击了"读取"按钮,系统将发出数据被读取的警告,同时输出所读取的内容。
>>> from tkinter import *
>>> def callbackW(args):
xL.set(xE.get())

>>> def callbackR(
args):
print("Warning:数据被读取!")

>>> def hit():
print("读取数据:",xE.get())

>>> root=Tk()
>>> root.title("ch6_5")
''
>>> xE=StringVar()
>>> entry=Entry(root,textvariable=xE)
>>> entry.pack(pady=5,padx=10)
>>> xE.trace("w",callbackW)
'2739082486792callbackW'
>>> xE.trace("r",callbackR)
'2739082953800callbackR'
>>> xL=StringVar()
>>> label=Label(root,textvariable=xL)
>>> xL.set("同步显示")
>>> label.pack(pady=5,padx=10)
>>> btn=Button(root,text="读取",command=hit)
>>> btn.pack(pady=5)
>>> root.mainloop()


xE.trace("r",callbackR)
上述第一个参数是模式,r代表当执行读取时,就自动去执行callbackR函数。也可以自行取函数
名称,这个动作成为读取追踪。我们可以通过xE变量类别追踪Widget控件内容被读取时执行的
特定动作。

#trace()方法调用的callback方法参数

def callbackW(args):

其实是传递三个参数,分别是tk变量名称、index索引、mode模式。不过目前有关tk变量名称和
index部分尚未完成实际支持,至于第三个参数则是可以列出是r或w模式。由于我们所设计的程序
并不需要传递参数,所以可以直接用"
args"当作参数内容。

样例:列出trace()方法所调用callbackI()方法内的参数。

>>> from tkinter import *
>>> def callbackW(name,index,mode):
xL.set(xE.get())
print("name=%r,index=%r,mode=%r" %(name,index,mode))
root=Tk()
root.title("ch6_5")
''

xE=StringVar()
entry=Entry(root,textvariable=xE)
entry.pack(pady=5,padx=10)
xE.trace("w",callbackW)
'1801680913800callbackW'
xL=Stringar()
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
xL=Stringar()
NameError: name 'Stringar' is not defined
xL=StringVar()
label=Label(root,textvariable=xL)
xL.set("同步显示")
label.pack(pady=5,padx=10)
root.mainloop()

上一篇下一篇

猜你喜欢

热点阅读