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

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.varFalse则转向红色.

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

我可以杀死原来的窗口并离开新的窗口,但这不应该是必要的.

所以我有两个问题:

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

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

  • 这里有什么问题?

我觉得tkinter是一个循环.当我改变它的值时,var它不应该循环并重新绘制屏幕并评估obj.var == FalseTrue

Ste*_*ski 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()
Run Code Online (Sandbox Code Playgroud)