У меня есть рамка прокрутки в TKinter. и список кортежей, которые я взял из своей базы данных (управляемой SQlite) для каждого кортежа в списке, я хочу создать строку виджетов в кадре прокрутки, используя цикл for. строка содержит номер строки, флажок, заголовок, взятый из кортежа, и кнопку, которая открывает ссылку, взятую из кортежа. у меня проблема в том, что я не знаю, как создать неизвестное количество строк виджетов в TKinter, а также иметь возможность ссылаться на них. приведенный ниже код работает в том смысле, что он создает строки и т. д., но после их создания я не могу ссылаться на отдельные виджеты. это важно, потому что флажок при клике должен обновить столбец IsActive в моей базе данных (помощь с этим также будет приветствоваться). Я попытался использовать словарь для хранения StringVar () для флажков, но я уверен, что сделал это неправильно.
сам класс является фреймом в окне TKinter. Я ценю, что это может быть глупый вопрос. Я новичок
class details(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="details", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
button = tk.Button(self, text="Go to the start page",
command=lambda: controller.show_frame("StartPage"))
button.place(relx=0.5, rely=0.95, anchor = tk.CENTER)
myframe= tk.Frame(self,relief=tk.GROOVE,bd=1)
myframe.place(relx=0.5, rely=0.45, anchor = tk.CENTER, width = 750, height = 450)
self.canvas=tk.Canvas(myframe)
self.frame=tk.Frame(self.canvas)
myscrollbar=tk.Scrollbar(myframe,orient="vertical",command=self.canvas.yview)
self.canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
self.canvas.pack(side="left", fill="both")
self.canvas.create_window((0,0),window=self.frame,anchor='nw')
self.frame.bind("<Configure>",self.myfunction)
self.data()
def data(self):
lock.acquire(True)
c.execute("select * from story")
lock.release()
results = c.fetchall()
print(results)
i = 0
checkbuttons = {}
## the for loop where rows are created.
for item in results:
checkbuttons[item[0]] = tk.IntVar()
b = item[4]
s = tk.StringVar()
tk.Label(self.frame,text=i).grid(row=i,column=0)
tk.Checkbutton(self.frame, text="", variable=checkbuttons[item[0]], onvalue=1, offvalue=0).grid(row=i,column=1)
tk.Label(self.frame,textvariable=s, width = 90).grid(row=i,column=2, sticky=tk.W)
tk.Button(self.frame,text="LINK", command=lambda a = b: self.open_link(a)).grid(row=i,column=3)
s.set(str(item[3]))
i+=1
def myfunction(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"),width=750,height=500)
def open_link(self, link):
print(link)
webbrowser.open(link, new=1)