Tkinter не заменяет Tk.Label после вызова метода destroy () - PullRequest
0 голосов
/ 12 июля 2019

Я расширил класс Tk.Label, чтобы настроить свои потребности, и по какой-то странной причине не уничтожаю объект, даже после вызова widget.destroy(), когда я обновляю значения. Таким образом, в основном, я бы получил self.update старое значение снизу и новое значение поверх старого значения.

import tkinter as tk

class GUI(tk.Frame):
  def __init__(self, master, *args, **kwargs)
    tk.Frame.__init__(self, *args, **kwargs)
    self.master = master

    self.update = Label(self.master, "Select a value", 0, 0)

    btn = tk.Button(text="Select", command=self.update_btn)
    btn.grid(row=0, column=1)

  def update_btn(self):
    # Destroy method being called here
    self.update.destroy()
    self.update = Label(self.master, "New value", 0, 0)

class Label(tk.Label):
  def __init__(self, root, label_name, row, col, *args, **kwargs):
    tk.Label.__init__(self, *args, **kwargs)
    label = tk.Label(root, text=label_name, *args, **kwargs)
    label.grid(row=row, column=col)

Любая помощь будет высоко ценится.

1 Ответ

2 голосов
/ 12 июля 2019

Твой класс странный. Вы создаете 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...