Как мне обновить экран (холст) окна Tkinter

#python #user-interface #tkinter

#python #пользовательский интерфейс #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.var False он становится красным.

Моя проблема в том, что исходное окно (то, что под ним) все еще синее.

Я мог бы закрыть исходное окно и оставить новое, но в этом не должно быть необходимости.

Итак, у меня есть 2 вопроса:

  • Как мне это решить?

Я пробовал after() , update_idletaskes но, похоже, ни один из них не работает, хотя я могу использовать неправильно.

  • В чем здесь проблема?

Предполагалось, что tkinter находится в цикле. Когда я меняю значение var , разве оно не должно зацикливаться и перерисовывать экран и оценивать obj.var == False как True ?

Ответ №1:

Каждый раз, когда вы вызываете 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()
  

Комментарии:

1. Большое вам спасибо. Это в значительной степени решает проблему. 1 и принятый ответ!