2017-06-06 126 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