如何在全局变量更改值时调用函数?
每当全局变量a
更改其值时,我怎样才能调用函数change_label
?用change_variable
我想模拟变量的实际变化(点击按钮时的变量变化)。如何在全局变量更改值时调用函数?
from tkinter import *
a = 3
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.master = master
self.button = Button(self.master, text='Change Variable', command=self.change_variable)
self.button.grid(row=0)
self.label = Label(self.master, text='Test')
self.label.grid(row=1)
def change_label(self):
self.label.config(bg='Red', fg='Yellow')
def change_variable(self):
global a
a = 1
def main():
root = Tk()
Application(root)
root.mainloop()
if __name__ == '__main__':
main()
如果使用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
值,与trace
结合的功能将被调用。
任何使用该变量的小部件也会被更新。例如,将您的标签更改为:
self.label = tk.Label(self.master, textvariable=self.a)
当您单击该按钮时,请注意标签更改以反映更改。
对于什么样的参数传递给跟踪功能的说明,请参见What are the arguments to Tkinter variable trace method callbacks?
这些变量有很好的描述在这里:The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)
如果您正在使用Tk
,这可能是值得探讨:Tk
's "Variable" classes
如果不适合你(因为你要保存自己的类型,或者类似的东西),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)
如果你不希望能够设置的变量,而不会触发一些代码,你放在那里,祝你好运。您也可以覆盖__setitem__
,但您始终可以将dict.__setitem__
与Storage
变量作为第一个参数。
试着运行这段代码,它会给你想要的东西。
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()
The code was supposed be like this.
from tkinter import *
a = 3
class Application(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.master = master
self.button = Button(self.master, text='Change Variable', command=self.change_label)
self.button.grid(row=0)
self.label = Label(self.master, text='Test')
self.label.grid(row=1)
def change_label(self):
global a
a = 1
if a != 3:
self.label.config(bg='Red', fg='Yellow')
def main():
root = Tk()
Application(root)
root.mainloop()
hope that is what you wanted.
为什么添加第二个答案? “代码应该是这样的”是什么意思?你是否知道你可以编辑你的原始答案? –
您不需要change_variable方法,您仍然可以在一个方法中执行change_variable方法。 – joshua
如果它不是一个问题,你可以使用一个轻量级线程定期监视该值。 –
好吧,你为什么不在所有改变'a'的地方调用'change_label'? – MSeifert
此外,请检查:[如何触发函数的值更改?](https://stackoverflow.com/questions/6190468/how-to-trigger-function-on-value-change) –