调用destroy()方法后,Tkinter不替换Tk.Label

时间:2019-07-11 21:31:46

标签: python python-3.x tkinter

我扩展了Tk.Label类以自定义我的需求,并且出于某种奇怪的原因,即使我在更新值时调用text之后也不会销毁该对象。因此,基本上,我最终将widget.destroy()的旧值放在底部,将新值放在旧值之上。

self.update

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的课程很奇怪。您在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,您甚至没有设置父级,因此在某些情况下可能会得到奇怪的结果。

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()