tkinter: как написать цикл for для уничтожения списка меток? - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь удалить эти элементы из сетки.Я был в состоянии удалить их все, выписав один за другим.Затем я написал цикл for, чтобы сделать его расширяемым, и столкнулся с этим сообщением об ошибке.

"employee.destroy()
AttributeError: 'str' object has no attribute 'destroy'"

Это часть более крупной программы, но, насколько я могу свести к основной проблеме, вот мой код:

import tkinter as tk
from tkinter import ttk

labelemployee={}

class Application(ttk.Frame): #inherent from frame.

    def __init__(self, parent):
        tk.Frame.__init__(self, parent, bg="LightBlue4")
        self.parent = parent
        self.Employees = ["A", "B", "C", "D"]
        self.pack(fill=tk.BOTH, expand=1)
        self.GUI()

    def GUI(self): #the function that runs all the GUI functions.
        self.buttons()
        self.create_grid()
        self.add_left_names()

    def remove(self):
        #labelemployee["A"].destroy()
        #labelemployee["B"].destroy()
        #labelemployee["C"].destroy()
        #labelemployee["D"].destroy()
        for employee in labelemployee:
            employee.destroy()

    def create_grid(self):
        for i in range (7):
             for j in range(7):
                self.label = tk.Label(self, relief="ridge", width=12, 
                       height=3)
                self.label.grid(row=i, column=j, sticky='nsew')

    def buttons(self):
        self.button=tk.Button(self, text="Clear", bg="salmon", command 
             = self.remove)
        self.button.grid(row=7, column=6, sticky='e')

    def add_left_names(self):
       #--------add in name labels on the side--------------        
        i=2
        for employee in self.Employees:
            self.label=tk.Label(self, text=employee ,  fg="red", 
               bg="snow")
            self.label.grid(row=i,column=0)
            labelemployee[employee]=self.label
            i +=1

def main():
    root = tk.Tk()
    root.title("class basic window")
    root.geometry("1000x500")
    root.config(background="LightBlue4")
    app = Application(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Пожалуйста, помогите мне.Я думаю, что проблема в моем цикле for хранится список, и у меня есть словарь.Итак, я думаю, я не знаю, как уничтожить ярлыки в словаре.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы уже выяснили проблему в этих комментариях!

Вы уже знаете, что labelemployee - это словарь, поэтому итерирование по нему даст вам по умолчанию ключи словаря. Так что employee будут строки типа A , B ... и так далее. И уничтожение строкового объекта, очевидно, даст вам ошибку. Вам нужно уничтожить соответствующий виджет tkinter. Поэтому для этого вы должны заменить employee.destroy() на labelemployee[employee].destroy() в цикле for.

...