Как уничтожить Label и Entry Tkinter Python?
Создаю label, ставлю его через place и пытаюсь удалить его self.label.destroy(), но ничего не получается, с entry то же самое, pack_forget не работает тоже. Combobox получается удалить через destroy. Как нужно удалять элементы label и entry?
from tkinter import *
from tkinter import ttk
class HoverButton(Button):
def __init__(self, master, **kw):
Button.__init__(self, master = master, **kw)
self.defaultBackground = '#2A2C2E'
self['bd'] = 0
self['activebackground'] = '#3C3E3F'
self['font'] = ('Roboto', 13)
self['cursor'] = "hand2"
self['bg'] = '#2A2C2E'
self.bind("<Enter>", self.on_enter)
self.bind("<Leave>", self.on_leave)
def on_enter(self, e):
self['background'] = '#262829'
def on_leave(self, e):
self['background'] = self.defaultBackground
class HoverLabel(Label):
def __init__(self, master, **kw):
Label.__init__(self, master = master, **kw)
self['bg'] = '#17191A'
self['fg'] = 'white'
self['font'] = ('Roboto', 12)
class mainWindow:
def __init__(self):
self.root = Tk()
self.root.configure(bg='#17191A')
self.root.geometry("1050x650+400+200")
self.root.minsize(850, 360)
self.root.resizable(width=True, height=True)
self.settings = [HoverButton(self.root, text="Button", fg='white', command=lambda: self.Settings()), 0]
self.settings[0].place(x=20, y=180, width=150, height=70)
def Settings(self):
if self.settings[1] == 0:
self.label = HoverLabel(self.root, text = "Text").place(x=600, y=30)
self.settings[1] = 1
else:
self.label.destroy()
self.settings[1] = 0
if __name__ == "__main__":
app = mainWindow()
app.root.mainloop()
Ответы (2 шт):
В этой строке:
self.label = HoverLabel(self.root, text = "Text").place(x=600, y=30)
в self.label записывается результат вызова метода place (который всегда возвращает None), а не объект HoverLabel. Из-за этого потом при попытке вызвать destroy вылетает ошибка, что у NoneType нет метода destroy (программа не прерывается, но в терминале эту ошибку видно).
Чтобы работало правильно, нужно вызовы place, pack, grid делать отдельно:
self.label = HoverLabel(self.root, text = "Text")
self.label.place(x=600, y=30)
На самом деле
self.label.destroy()
работает только в customtkinter. Вижу ты тоже новичок, что на tkinter кодишь. В tkinter нужно использовать функции например
self.label.forget_pack()
self.label.forget_place()
self.label.forget_grid()
в зависимости какой метод размешения использовался. Удачи в программировании! Поправочка:destroy работает тоже в tkinter но видимо у тебя он не работает так что можешь использовать что я написал. Удачи!