Как обновить экран (холст) окна Tkinter - PullRequest
1 голос
/ 27 октября 2011

Я довольно много искал и не нашел ответа.

Я выследил и свел свою проблему к этому примеру.

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, но, похоже, ни один из них не работает, хотя я могу использовать неправильно.

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

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

1 Ответ

5 голосов
/ 27 октября 2011

Каждый раз, когда вы звоните 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...