您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

修改变量值时该怎么办?

修改变量值时该怎么办?

一种方法是利用可变类(的BooleanVarDoubleVarIntVarStringVarVariable),以及它们的trace_add方法。当实例拥有的值被修改时,它允许调用一个方法

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def do_stuff(*_):   # trace_add implicitly passes 3 internal arguments
    demo['text'] = var.get() # to obtain the value var holds


if __name__ == '__main__':
    root = tk.Tk()
    var = tk.StringVar(value="Value")
    #var = tk.BooleanVar(value=True)
    #var = tk.DoubleVar(value=2.78)
    #var = tk.IntVar(value=0)
    #var = tk.Variable(value=["Value", True, 2.78, 0])
    demo = tk.Label(root, text=var.get())
    demo.pack()
    var.trace_add('write', do_stuff)    # call do_stuff when var is set
    var.set("New Value")    # to replace the value var holds
    #var.set(False)
    #var.set(3.14)
    #var.set(42)
    #var.set(["New Value", False, 3.14, 42])
    tk.mainloop()

还需要注意的是,尽管并非总是实用,但某些小部件具有变量选项(变量,文本变量,列表变量),这些选项允许它们持有的值与变量类对象的值同步。下面的示例利用了这一点:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


if __name__ == '__main__':
    root = tk.Tk()
    var = tk.StringVar(value="Value")
    demo = tk.Label(root, textvariable=var)
    demo.pack()
    var.set("New Value")    # label is in sync right-away
    tk.mainloop()

另一种方法是在使用class时__setattr__利用对象的属性分配魔术方法

例如,demo标签将在每次self.string修改属性时更新:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


class MyLabel(tk.Label):
    def __init__(self, master, var="", *args, **kwargs):
        tk.Label.__init__(self, master, *args, **kwargs)
        self.var = var


    def __setattr__(self, name, value):
        self.__dict__[name] = value
        if name == 'var':
            self.do_stuff()


    def do_stuff(self):
        self['text'] = self.var


if __name__ == '__main__':
    root = tk.Tk()
    demo = MyLabel(root, "Value")
    demo.pack()
    demo.var = "New Value"
    tk.mainloop()
其他 2022/1/1 18:36:11 有292人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶