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

1 投票
1 回答
4940 浏览
提问于 2025-04-17 05:07

我搜索了很久,但还是没找到答案。

我把问题缩小到这个例子。

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.varFalse 的时候,它会变成红色。

我的问题是,原来的窗口(在下面的那个)还是蓝色的。

我可以关闭原来的窗口,只保留新的那个,但这样做似乎没必要。

所以我有两个问题:

  • 我该怎么解决这个问题?

我试过 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()

撰写回答