每当全局变量改变它值时如何调用函数?

时间:2017-06-06 11:10:52

标签: python tkinter

当全局变量change_label改变其值时,如何调用函数a?使用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()

4 个答案:

答案 0 :(得分:1)

如果您使用其中一个特殊变量(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)

这样,只要您通过self.a方法设置set的值,就会调用与trace绑定的函数。

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

self.label = tk.Label(self.master, textvariable=self.a)

单击该按钮时,请注意标签会发生变化以反映更改。

有关传递给trace函数的参数的说明,请参阅What are the arguments to Tkinter variable trace method callbacks?

这些变量在这里有一个很好的描述:The Variable Classes (BooleanVar, DoubleVar, IntVar, StringVar)

答案 1 :(得分:0)

如果您使用SELECT * FROM asset_db_batch_material_id INNER JOIN asset_db_batch ON asset_db_batch_material_id.batch_id = asset_db_batch.id INNER JOIN asset_db_assetmetadata ON asset_db_batch_material_id.assetmetadata_id = asset_db_assetmetadata.id WHERE user_id = 1 ,则可能需要查看:Tk's "Variable" classes

如果这对你不起作用(因为你想存储自己的类型,或类似的东西),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) ,但始终可以使用__setitem__变量作为第一个参数调用dict.__setitem__

答案 2 :(得分: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()

答案 3 :(得分:-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.