当全局变量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()
答案 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.