2017-06-06 128 views
0

每当全局变量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() 
+0

如果它不是一个问题,你可以使用一个轻量级线程定期监视该值。 –

+0

好吧,你为什么不在所有改变'a'的地方调用'change_label'? – MSeifert

+0

此外,请检查:[如何触发函数的值更改?](https://stackoverflow.com/questions/6190468/how-to-trigger-function-on-value-change) –

回答

0

如果使用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)

0

如果您正在使用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变量作为第一个参数。

0

试着运行这段代码,它会给你想要的东西。

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() 
-1
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. 
+0

为什么添加第二个答案? “代码应该是这样的”是什么意思?你是否知道你可以编辑你的原始答案? –

+0

您不需要change_variable方法,您仍然可以在一个方法中执行change_variable方法。 – joshua