Python 当全局变量改变函数的值时,如何调用函数?

Python 当全局变量改变函数的值时,如何调用函数?,python,tkinter,Python,Tkinter,当全局变量a更改其值时,如何调用函数change\u label?使用change\u variable我试图模拟变量的实际变化(单击按钮时变量会发生变化) 如果您使用的是Tk,这可能值得研究: 如果这对您不起作用(因为您想存储自己的类型或类似的内容),Shiva的注释是一种方法,如果您想存储多个变量,这可能是一个好主意: class Storage(dict): def __getattribute__(self, name): return self[name]

当全局变量
a
更改其值时,如何调用函数
change\u label
?使用
change\u variable
我试图模拟变量的实际变化(单击按钮时变量会发生变化)


如果您使用的是
Tk
,这可能值得研究:

如果这对您不起作用(因为您想存储自己的类型或类似的内容),
Shiva
的注释是一种方法,如果您想存储多个变量,这可能是一个好主意:

class Storage(dict):
    def __getattribute__(self, name):
        return self[name]

    def __setattr__(self, name, value):
        print(name, value)  # react to the change of name
        self[name] = value

storage = Storage({a: 3, b: 2})

storage.a = 4
print(storage.a)

如果你不想在不触发代码的情况下设置变量,祝你好运。您也可以覆盖
\uuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,但您可以始终调用
dict.\uuuuuuuuuu setitem\uuuuuuuuuuuuuuuu

import tkinter
count = 5
def change_text():
        global count
        if count != 2:
                button.config(text='edit')

frame = tkinter.Frame(height=500,width=500)
button = tkinter.Button(frame,text='save',command=change_text)
button.place(x=0,y=0)
frame.pack()
frame.mainloop()

如果使用tkinters的一个特殊变量(
StringVar
等),则可以添加一个“跟踪”,每当设置或取消设置变量时,该跟踪将触发回调

例如:

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        ...
        self.a = tk.IntVar(value=3)
        self.a.trace("w", self.change_label)
        ...

    def change_label(self, *args):
        self.label.config(bg='Red', fg='Yellow')

    def change_variable(self):
        self.a.set(1)
这样,无论何时通过
set
方法设置
self.a
的值,都将调用与
跟踪绑定的函数

任何使用该变量的小部件也将被更新。例如,将标签更改为:

self.label = tk.Label(self.master, textvariable=self.a)
单击该按钮时,请注意标签会更改以反映更改

有关传递给跟踪函数的参数的说明,请参阅


这些变量在这里有很好的描述:

如果不是问题,可以使用轻量级线程定期监视值。好的,为什么不在所有更改
a
的地方调用
change\u label
,检查一下:为什么不在对象上使用属性而不是全局属性,然后可以从setter调用函数。为什么要添加第二个答案?“代码应该是这样的”是什么意思?你知道你可以编辑你的原始答案吗?你不需要改变变量的方法,你仍然可以在一个方法中完成所有这些,就像改变变量的方法一样。
class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        ...
        self.a = tk.IntVar(value=3)
        self.a.trace("w", self.change_label)
        ...

    def change_label(self, *args):
        self.label.config(bg='Red', fg='Yellow')

    def change_variable(self):
        self.a.set(1)
self.label = tk.Label(self.master, textvariable=self.a)