Обновление toplevel окна Ошибка:_tkinter.TclError: invalid command name ".!child2.!entry" Как правильно пересоздать окно, чтобы грид сбрасывался?

Кнопка на открытие Child2 размещена в тулбаре, по значению пока что одного поля делает SELECT, но если делать запрос несколько раз, старый грид не сбрасывается. Я не могу понять как правильно пересоздать окно. В def return_entry, который забинден на кнопку запроса, вставил .destroy(), получается ошибка из сабжа:

import tkinter as tk
from tkinter import ttk
import fdb
con = fdb.connect(dsn='C:\TEST.FDB', user='SYSDBA', password='masterkey', charset='UTF-8')

class Main(tk.Frame):
    def __init__ (self, root):
        super().__init__(root)
        self.init_main()

    def init_main(self):
        toolbar = tk.Frame (bg="#d7d8e0", bd=2)
        toolbar.pack(side=tk.TOP, fill=tk.X)

        self.add_img2 = tk.PhotoImage(file='btn_1.gif')
        bnt_open_dialog2 = tk.Button(toolbar, text="текст", command=self.open_dialog2, bg="#d7d8e0", bd=0,
                                    compound=tk.TOP, image=self.add_img2)
        bnt_open_dialog2.pack(side=tk.LEFT)

        info = tk.Frame (bg="#F0F0F0", bd=2)
        info.pack(side=tk.TOP, fill=tk.X)

    def open_dialog2(self):
        Child2()

class Child2(tk.Toplevel):
    def __init__ (self):
        super().__init__(root)
        self.init_child2()

    def init_child2(self):
        self.title("тайтл дочернего окна")
        self.geometry('880x450+400+300')
        self.resizable(True,True)
        self.put()
    def put(self):
        self.label_ser_0 = tk.Label (self, text="ID", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_0.grid(row=2, column=0)
        self.label_ser_1 = tk.Label (self, text="Фамилия", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_1.grid(row=2, column=1)
        self.label_ser_2 = tk.Label (self, text="Имя", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_2.grid(row=2, column=2)
        self.label_ser_3 = tk.Label (self, text="Отчество", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_3.grid(row=2, column=3)
        self.label_ser_4 = tk.Label (self, text="Пол", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_4.grid(row=2, column=4)
        self.label_ser_5 = tk.Label (self, text="Возраст", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_5.grid(row=2, column=5)
        self.label_ser_6 = tk.Label (self, text="Статус", pady=5, bg="#F0F0F0", width=20)
        self.label_ser_6.grid(row=2, column=6)
        self.entry_s = ttk.Entry(self)
        self.entry_s.grid(row=1, column=1)

        def return_entry(event):
            Child2.destroy(self) #здесь происходит destroy и выдает ошибку. Думал сделать destroy и пересоздать окно
            cur = con.cursor()
            cur.execute("SELECT * FROM PATS WHERE Fam LIKE"" '"+self.entry_s.get()+"%'")

            PATS_ID=[]
            FamEntries=[]
            ImyaEntries=[]
            BatkEntries=[]
            GENDEREntries=[]
            AGEEntries=[]
            POSITEntries=[]

            i=3
            for slice in cur.fetchall():

                PATS_ID.append(slice[0])
                PATS_ID.append(ttk.Entry(self))
                FamEntries.append(ttk.Entry(self))
                ImyaEntries.append(ttk.Entry(self))
                OtchEntries.append(ttk.Entry(self))
                GENDEREntries.append(ttk.Entry(self))
                AGEEntries.append(ttk.Entry(self))
                POSITEntries.append(ttk.Entry(self))

                PATS_ID[-1].insert(0,slice[0])
                FamEntries[-1].insert(0,slice[1])
                ImyaEntries[-1].insert(0,slice[2])
                OtchEntries[-1].insert(0,slice[3])
                GENDEREntries[-1].insert(0,slice[4])
                AGEEntries[-1].insert(0,slice[5])
                POSITEntries[-1].insert(0,slice[6])

                PATS_ID[-1].grid(row=i, column=0)
                FamEntries[-1].grid(row=i, column=1)
                ImyaEntries[-1].grid(row=i, column=2)
                OtchEntries[-1].grid(row=i, column=3)
                GENDEREntries[-1].grid(row=i, column=4)
                AGEEntries[-1].grid(row=i, column=5)
                POSITEntries[-1].grid(row=i, column=6)
                i+=1

        self.button_s = tk.Button(self, text="Поиск")
        self.button_s.grid(row=1, column=0, pady=5)
        self.button_s.bind("<Button-1>", return_entry)

        self.grab_set()
        self.focus_set()

if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack()
    root.title("тайтл")
    root.geometry("880x450")
    root.resizable(True, True)

    root.mainloop()

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

Автор решения: Сергей Кох

Разделите функцию return_entry(event):

def return_entry(event):
    if "Надо перерисовать":
        Child2.destroy(self)
        Child2()
    else:
         cur = con.cursor()
         cur.execute("SELECT * FROM PATS WHERE Fam LIKE"" '"+self.entry_s.get()+"%'") 
...

Я не знаю сабж, но посмотрите может может есть возможность поменять значения в элементах типа PATS_ID.append(ttk.Entry(self)) без разрушения и воссоздания окна.

→ Ссылка