Tru*_*ufa 1 python user-interface tkinter
我搜索得非常广泛,但没有找到答案.
我已经跟踪并减少了我的问题到这个例子.
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()
Run Code Online (Sandbox Code Playgroud)
如您所见,矩形具有条件itemconfig.
行paintGui()内meth()仅表明该代码工作,当obj.var是False则转向红色.
我的问题是原始窗口(它下面的窗口)仍然是蓝色的.
我可以杀死原来的窗口并离开新的窗口,但这不应该是必要的.
所以我有两个问题:
虽然我可能使用不正确after(),update_idletaskes但我已经尝试了但是它们似乎都没有工作.
我觉得tkinter是一个循环.当我改变它的值时,var它不应该循环并重新绘制屏幕并评估obj.var == False为True?
每次打电话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()
Run Code Online (Sandbox Code Playgroud)