Как удалит обьект в tkinter?
Моя программа проверяет логин и пароль, и выводит текст с удачной или неудачной попыткой в виде виджета. И при нажатии на кнопку, виджет накладывается на другой. Как сделать так, чтобы виджет удалялся, и на место его была выведена следующая попытка?
import tkinter as tk
win = tk.Tk()
win.geometry(f'400x500')
win.title('Мое приложение')
password = '123'
login = 'Aleks'
def get_entry():
global password, login
val1 = password_get.get()
val2 = login_get.get()
if val1 == password and val2 == login:
l = tk.Label(win, text='Вы успешно вошли!').grid(row=3, column=1)
else:
k = tk.Label(win, text='Неверный логин или пароль!').grid(row=3, column=1)
def delet1():
password_get.delete(0, tk.END)
def delet2():
login_get.delete(0, tk.END)
lbl = tk.Label(win, text='Пароль').grid(row=0, column=0)
lbl2 = tk.Label(win, text='Логин').grid(row=1, column=0)
password_get = tk.Entry(win)
password_get.grid(row=0, column=1)
login_get = tk.Entry(win)
login_get.grid(row=1, column=1)
btn = tk.Button(win, text='get', command=get_entry).grid(row=2, column=1)
btn2 = tk.Button(win, text='del', command=delet1).grid(row=0, column=2)
btn3 = tk.Button(win, text='del', command=delet2).grid(row=1, column=2)
win.mainloop()
Не ругайте за говнокод) Пока только учусь
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Способов несколько...
- Запоминать ссылку на
Labelи каждый раз удалять предыдущую при помощи методаdestroy()и пересоздавать заново:
...
status_label = None # для запоминания ссылки на виджет
def get_entry():
global password, login, status_label
val1 = password_get.get()
val2 = login_get.get()
if status_label:
status_label.destroy() # уничтожаем старый виджет
if val1 == password and val2 == login:
status_label = tk.Label(win, text='Вы успешно вошли!')
else:
status_label = tk.Label(win, text='Неверный логин или пароль!')
status_label.grid(row=3, column=0, columnspan=3)
...
Labelсоздать один раз и потом менять в ней текст при помощи методаconfigure():
...
def get_entry():
global password, login
val1 = password_get.get()
val2 = login_get.get()
if val1 == password and val2 == login:
status_label.configure(text='Вы успешно вошли!')
else:
status_label.configure(text='Неверный логин или пароль!')
...
lbl = tk.Label(win, text='Пароль').grid(row=0, column=0)
lbl2 = tk.Label(win, text='Логин').grid(row=1, column=0)
status_label = tk.Label(win)
status_label.grid(row=3, column=0, columnspan=3)
...
- Создать
Labelединожды и указать ей параметрtextvariableсо ссылкой на переменную. Тогда при изменении этой переменной текст будет автоматически отображён вLabel:
...
status = tk.StringVar() # переменная с содержимым для Label
def get_entry():
global password, login
val1 = password_get.get()
val2 = login_get.get()
if val1 == password and val2 == login:
status.set('Вы успешно вошли!')
else:
status.set('Неверный логин или пароль!')
...
lbl = tk.Label(win, text='Пароль').grid(row=0, column=0)
lbl2 = tk.Label(win, text='Логин').grid(row=1, column=0)
tk.Label(win, textvariable=status).grid(row=3, column=0, columnspan=3)
...