Обновить основное окно tkinter новыми данными

При вводе имени ниже в каждой строке выводятся кнопки по количеству свойств имени. Их может быть разное количество. В чем проблема? При вводе имени с числом свойств, например, 5 заполняется пять строк кнопок. При вводе следующего имени с меньшим числом свойств, например, 3, они заполняются верными данными, но остальные (старые, от предыдущего имени) остаются. То есть должно остаться 3 кнопки, но получается 5. 3 с корректными данными и 2 лишние от предыдущего запроса.Надеюсь доходчиво объяснил.

import tkinter as tk
from tkinter import messagebox


def on_button():

    # получение имени в верхнем регистре
    text = entry_name.get().upper()
    entry_name.delete(0, 'end')
    entry_name.insert(0, text)

    # проверка на наличие имени в БД
    try:
        with open('database.pickle', 'rb') as file:
            database, date_database = load(file)
             # если нет, то вывести сообщение и очистить 
             # поле ввода
                if text not in database:
                messagebox.showinfo('Внимание',
                                    'Нет такого имени в БД')
                # очистить имя в поле ввода
                entry_name.delete(0, 'end')
            else:
                # создается метка связанная с полем ввода
                l_name = tk.Label(root, textvariable=name, font=FONT, bg='black', fg='white')
                l_name.grid(row=3, column=0, columnspan=2)
                # кнопки свойств имени
                c_row = 4
                for key, value in database[text].items():
                    if database[text][key]:
                        tk.Button(text=key, bg='green', fg='white', font=FONT
                                  ).grid(row=c_row, column=0, sticky='wens')
                        c_row += 1
    except:
        messagebox.showinfo('Внимание',
                            'Ошибка программы при вводе имени')
        root.destroy()


def on_enter(event):
    on_button()


root = tk.Tk()
# размеры окна
root_width = 350
root_height = 500

# получить разрешение экрана
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# запретить изменение размеров окна
root.resizable(False, False)

# расположить окно программы по центру
w = screen_width // 2  - root_width // 2
h = screen_height // 2 - root_height // 2
root.geometry(f'{root_width}x{root_height}+{w}+{h}')

# название приложения с картинкой
root.title('БД БЧС')
icon = tk.PhotoImage(file='icon.png')
root.iconphoto(False, icon)

# установить черный фон окна
root.config(bg='black')

# окно состоит из двух равных колонок
for col in range(COL):
    root.grid_columnconfigure(col, weight=1)

name = tk.StringVar()
label_name = tk.Label(root, text='Имя', font=FONT, bg='black', fg='white')
entry_name = tk.Entry(root, textvariable=name, font=FONT, justify='center')
# установить курсор в поле ввода имени
entry_name.focus_set()
# вводить имя нажатием клавиши Enter
entry_name.bind('<Return>', on_enter)
button = tk.Button(root, text='Ввод', font=FONT, bg='black', fg='white',
                 command=on_button)

label_name.grid(row=0, column=0, columnspan=2)
entry_name.grid(row=1, column=0, columnspan=2, sticky='we')
button.grid(row=2, column=0, columnspan=2, sticky='we')



root.mainloop()

Ответы (0 шт):