#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 и принятый ответ!