В настоящее время я пытаюсь создать кнопку, которая удаляет метки, создаваемые другой функцией. Эта другая функция создает ярлыки с одинаковыми именами, например:

def display():
          global overall_data
          length = len(overall_data)
          print(length)
          for i in range(len(overall_data)):
             print("i = " + str(i))
             bg_colour = "Black"
             l = tk.Message(my_frame3, 
                          text = "Name = " + str(overall_data[i][0]) + "\n"
                                 "Health =           /" + str(overall_data[i][1]) + "   \n"
                                 "Armour Class = " + str(overall_data[i][2]) + "\n"
                                 "Initiative = " + str(overall_data[i][3]),
                          fg='White', 
                          bg=bg_colour)
             l.place(x = 20 + i*150, y = 60, width=120, height= 80)
             string = str(overall_data[i][1])
             data = tk.StringVar(my_frame3, value = string)
             health_input = tk.Entry(my_frame3, textvariable = data, width = 15,fg = "Black",bg = "White")
             health_input.place(x = 85 + i*150, y = 85, width = 25, height=15)

По сути, total_data - это 2-мерный массив. Эта функция будет выводить каждую часть массива по одной, например [[1,2,3,4], [2,3,4,5]], она будет выводить одну метку для [1,2,3, 4] и еще один для [2,3,4,5]. Теперь у меня есть еще одна функция, которая должна удалить все метки, созданные этой функцией. В настоящее время я пробовал просто использовать:

def remove_labels():
   my_frame3.destroy()

Но это удаляет весь кадр, что говорит само за себя, но я подумал, что могу также попробовать. Еще я пробовал l.destroy (), но он также не работал, говоря, что l не был определен, что, как я думаю, связано с тем, что это временная переменная, существующая только внутри цикла for. Я сделал l глобальным, но тогда будет уничтожена только последняя метка для l. Я видел несколько ответов, предлагающих упаковку, но я избегал этого в своем коде, так как нашел место проще. Хотя если других вариантов нет, то воспользуюсь.

0
Chelsea Lim 28 Окт 2020 в 09:46

2 ответа

Лучший ответ

Получил помощь в комментариях, но разместил здесь, чтобы было легче увидеть. Обычно просто сохраняйте ярлыки в списке по мере их создания и уничтожайте их одну за другой позже. Как это:

        def display():
          global x   
          x = []
          global y
          y = []
          global overall_data
          length = len(overall_data)
          print(length)
          for i in range(len(overall_data)):
             print("i = " + str(i))
             global l
             bg_colour = "Black"
             l = tk.Message(my_frame3, 
                          text = "Name = " + str(overall_data[i][0]) + "\n"
                                 "Health =           /" + str(overall_data[i][1]) + "   \n"
                                 "Armour Class = " + str(overall_data[i][2]) + "\n"
                                 "Initiative = " + str(overall_data[i][3]),
                          fg='White', 
                          bg=bg_colour)
             x.append(l)
             l.place(x = 20 + i*150, y = 60, width=120, height= 80)
             string = str(overall_data[i][1])
             data = tk.StringVar(my_frame3, value = string)
             health_input = tk.Entry(my_frame3, textvariable = data, width = 15,fg = "Black",bg = "White")
             health_input.place(x = 85 + i*150, y = 85, width = 25, height=15)
             y.append(health_input)
        def remove_labels():
             for i in range(len(x)):
                  x[i].destroy()
             for i in range(len(y)):
                  y[i].destroy()
0
Chelsea Lim 29 Окт 2020 в 17:41

Если my_frame3 содержит только те виджеты, которые вы хотите уничтожить позже, вы можете изменить remove_labels(), как показано ниже:

def remove_labels():
    for child in my_frame3.winfo_children():
        child.destroy()
0
acw1668 28 Окт 2020 в 07:33