美文网首页
六、变量类别

六、变量类别

作者: 蝉时雨丶 | 来源:发表于2020-06-21 16:00 被阅读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()

    相关文章

      网友评论

          本文标题:六、变量类别

          本文链接:https://www.haomeiwen.com/subject/xuraxktx.html