我搜索得非常广泛而且没有找到答案。
我已经跟踪并减少了我的问题到这个例子。
from Tkinter import *
class A:
def __init__(self):
self.var = True
obj = A()
def meth():
obj.var = False
paintGui()
def paintGui():
master = Tk()
w = Canvas(master, width=200, height=100)
w.pack()
w.create_rectangle(50, 25, 150, 75, fill="blue", tags="rect")
btn = Button(master, text="Cerrar Mesa",command=meth)
btn.pack(side=BOTTOM)
if obj.var == False:
w.itemconfig("rect", fill="red")
mainloop()
paintGui()
如您所见,矩形具有条件itemconfig
。
paintGui()
内的meth()
行只是为了表明代码正常运作,而obj.var
为False
则会变为红色。
我的问题是原始窗口(它下面的窗口)仍然是蓝色。
我可以杀死原来的窗口并离开新窗口,但这不是必需的。
所以我有两个问题:
我已经尝试了after()
和update_idletaskes
但是,虽然我可能使用不正确,但它们似乎都没有效果。
我渴望得到一个循环。当我更改var
的值时,不应该循环并重新绘制屏幕并将obj.var == False
评估为True
?
答案 0 :(得分:5)
每次拨打paintGui
时,都会创建一个全新的窗口。那是因为您正在调用Tk()
,创建新的小部件并运行新的mainloop
。这些事情只需要发生一次,因此请将它们从paintGui
函数中删除。
您的代码的最低限度修改版本可以满足您的需求。
from Tkinter import *
class A:
def __init__(self):
self.var = True
obj = A()
def meth():
obj.var = False
paintGui()
def paintGui():
if obj.var == False:
w.itemconfig("rect", fill="red")
master = Tk()
w = Canvas(master, width=200, height=100)
w.pack()
w.create_rectangle(50, 25, 150, 75, fill="blue", tags="rect")
btn = Button(master, text="Cerrar Mesa",command=meth)
btn.pack(side=BOTTOM)
mainloop()