如何更新Tkinter窗口的屏幕(画布)

时间:2011-10-27 15:26:12

标签: 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()

如您所见,矩形具有条件itemconfig

paintGui()内的meth()行只是为了表明代码正常运作,而obj.varFalse则会变为红色。

我的问题是原始窗口(它下面的窗口)仍然是蓝色。

我可以杀死原来的窗口并离开新窗口,但这不是必需的。

所以我有两个问题:

  • 我该如何解决这个问题?

我已经尝试了after()update_idletaskes但是,虽然我可能使用不正确,但它们似乎都没有效果。

  • 这里有什么问题?

我渴望得到一个循环。当我更改var的值时,不应该循环并重新绘制屏幕并将obj.var == False评估为True

1 个答案:

答案 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()