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)