如何更新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()
你可以看到这个矩形有一个条件的 itemconfig
。
在 meth()
里面的 paintGui()
只是为了演示代码在工作,当 obj.var
是 False
的时候,它会变成红色。
我的问题是,原来的窗口(在下面的那个)还是蓝色的。
我可以关闭原来的窗口,只保留新的那个,但这样做似乎没必要。
所以我有两个问题:
- 我该怎么解决这个问题?
我试过 after()
和 update_idletasks
,但它们似乎都不管用,可能是我用错了。
- 这里的问题是什么?
我以为 tkinter 应该是循环运行的。当我改变 var
的值时,难道它不应该循环并重新绘制屏幕,把 obj.var == False
评估为 True
吗?
1 个回答
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()