Обновление 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)) без разрушения и воссоздания окна.