У меня есть список виджетов Tkinter, которые я хочу изменить динамически.
Как я могу полностью удалить виджеты из моего окна?
У меня есть список виджетов Tkinter, которые я хочу изменить динамически.
Как я могу полностью удалить виджеты из моего окна?
Вы можете вызвать pack_forget
, чтобы удалить виджет (если вы используете pack
, чтобы добавить это к окну).
Пример:
from tkinter import *
root = Tk()
b = Button(root, text="Delete me", command=lambda: b.pack_forget())
b.pack()
root.mainloop()
Если вы используете pack_forget
, позже вы можете снова увидеть виджет, снова вызывающий pack
. Если вы хотите окончательно удалить его, вызовите destroy
в виджет (тогда вы не сможете его повторно добавить).
Если вы используете метод grid
, вы можете использовать grid_forget
или grid_remove
для скрытия виджета.
Один из способов сделать это - получить список подчиненных из фрейма, который необходимо очистить, уничтожить или "спрятать" в соответствии с вашими потребностями. Чтобы получить четкую рамку, вы можете сделать это следующим образом:
from tkinter import *
root = Tk()
def clear():
list = root.grid_slaves()
for l in list:
l.destroy()
Label(root,text='Hello World!').grid(row=0)
Button(root,text='Clear',command=clear).grid(row=1)
root.mainloop()
Вы должны вызвать grid_slaves()
, pack_slaves()
или slaves()
в зависимости от метода, который вы использовали для добавления виджета в фрейм.
Я обнаружил, что, когда виджет является частью функции, а grid_remove
является частью другой функции, он не удаляет ярлык. В этом примере...
def somefunction(self):
Label(self, text=" ").grid(row = 0, column = 0)
self.text_ent = Entry(self)
self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
somefunction.text_ent.grid_remove()
... не существует допустимого способа удаления метки.
Единственное решение, которое я смог найти, - дать ярлыку имя и сделать его глобальным:
def somefunction(self):
global label
label = Label(self, text=" ")
label.grid(row = 0, column = 0)
self.text_ent = Entry(self)
self.text_ent.grid(row = 1, column = 0)
def someotherfunction(self):
global label
somefunction.text_ent.grid_remove()
label.grid_remove()
Когда я столкнулся с этой проблемой, был задействован класс, одна функция была в классе, а другая нет, поэтому я не уверен, что строки global label
действительно необходимы в приведенном выше.
Сегодня я изучаю простую и эффективную обработку событий click, используя библиотеку tkinter gui в python3, которую я хотел бы поделиться внутри этого потока.
from tkinter import *
cnt = 0
def MsgClick(event):
children = root.winfo_children()
for child in children:
# print("type of widget is : " + str(type(child)))
if str(type(child)) == "<class 'tkinter.Message'>":
# print("Here Message widget will destroy")
child.destroy()
return
def MsgMotion(event):
print("Mouse position: (%s %s)" % (event.x, event.y))
return
def ButtonClick(event):
global cnt, msg
cnt += 1
msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...")
msg.config(bg='lightgreen', font=('times', 24, 'italic'))
msg.bind("<Button-1>", MsgClick)
msg.bind("<Motion>", MsgMotion)
msg.pack()
#print(type(msg)) tkinter.Message
def ButtonDoubleClick(event):
import sys; sys.exit()
root = Tk()
root.title("My First GUI App in Python")
root.minsize(width=300, height=300)
root.maxsize(width=400, height=350)
button = Button(
root, text="Click Me!", width=40, height=3
)
button.pack()
button.bind("<Button-1>", ButtonClick)
button.bind("<Double-1>", ButtonDoubleClick)
root.mainloop()
Надеюсь, что это поможет кому-то...