Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更新Tkinter窗口的屏幕(画布)_Python_User Interface_Tkinter - Fatal编程技术网

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

Python 如何更新Tkinter窗口的屏幕(画布),python,user-interface,tkinter,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, he

我已经找了很多遍,还没有找到答案

我已经追踪并将我的问题简化为这个例子

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时,它将变为红色

我的问题是原来的窗户——它下面的那扇仍然是蓝色的

我可以关闭原来的窗口,留下新窗口,但这不必要

所以我有两个问题:

我如何解决这个问题? 我已经尝试过跟踪和更新_idletaskes,但它们似乎都不起作用,尽管我可能使用了错误的方法

这里有什么问题? 我认为特金特是在一个循环中。当我更改var的值时,它是否应该循环并重新绘制屏幕,并将obj.var==False评估为True?

每次调用paintGui时,它都会创建一个全新的窗口。这是因为您正在调用Tk,创建新的小部件,并运行新的主循环。这些事情只需要发生一次,所以将它们从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()
每次调用paintGui,它都会创建一个全新的窗口。这是因为您正在调用Tk,创建新的小部件,并运行新的主循环。这些事情只需要发生一次,所以将它们从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()

非常感谢你。这基本上解决了问题+1和接受答案!非常感谢你。这基本上解决了问题+1和接受答案!