Обновить основное окно 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()