Твой класс странный. Вы создаете Label
внутри Label
и показывает только внутреннюю метку. А позже вы уничтожите внешнюю метку, но она не уничтожит внутреннюю метку.
Правильная версия
class Label(tk.Label):
def __init__(self, root, label_name, row, col, *args, **kwargs):
tk.Label.__init__(self, *args, master=root, text=label_name, **kwargs)
self.grid(row=row, column=col)
В Python 3.x вы можете написать это
class Label(tk.Label):
def __init__(self, root, label_name, row, col, *args, **kwargs):
super().__init__(*args, master=root, text=label_name, **kwargs)
self.grid(row=row, column=col)
Теперь для обновления текста вы можете использовать
self.update["text"] = "..."
или
self.update.config(text="...")
вместо `self.update.label [" text "] = ...
РЕДАКТИРОВАТЬ: класс GUI
также странно. Вы создаете Frame
, но вы не показываете его (вы не используете pack / grid), и вы используете главное окно в качестве родительского для Label
. Для Button
вы даже не устанавливаете parent, поэтому в некоторых ситуациях вы можете получить странный результат.
import tkinter as tk
class GUI(tk.Frame):
def __init__(self, master, *args, **kwargs):
super().__init__(*args, master=master, **kwargs)
# show frame
self.pack()
# add to frame (self)
self.update = Label(self, "Select a value", 0, 0)
# add to frame (self)
btn = tk.Button(self, text="Select", command=self.update_btn)
btn.grid(row=0, column=1)
def update_btn(self):
self.update['text'] = "New value"
#self.update.config(text="New value")
class Label(tk.Label):
def __init__(self, root, label_name, row, col, *args, **kwargs):
super().__init__(*args, master=root, text=label_name, **kwargs)
self.grid(row=row, column=col)
root = tk.Tk()
GUI(root)
root.mainloop()