Вам нужно использовать список для хранения экземпляров StringVar
. Чтобы получить доступ к правильному экземпляру StringVar
внутри функций close_yes()
и close_no()
, вам необходимо передать им правильный индекс, используя лямбду и значение по умолчанию для аргумента лямбда:
def close_yes(i):
print('close_yes:', i, v[i].get())
def close_no(i):
print('close_no:', i, v[i].get())
...
v = [None] * len(solutions) # list to hold the StringVar instances
for ii in range(len(solutions)):
tk.Label(text=solutions[ii], bg="lightsalmon", fg="black", font=("times", 10), relief=tk.RIDGE,
width=50, anchor="w").grid(row=ii+1,column=3, ipadx=0, ipady=0, rowspan=1, sticky=tk.N+tk.E+tk.S+tk.W)
v[ii] = tk.StringVar()
checkbutton1 = tk.Checkbutton(mywindow, text='YES', onvalue='YES', variable=v[ii],
bg="red", fg="black", font=("times", 10), width=3, anchor="w",
command=lambda i=ii: close_yes(i)) # use lambda to pass the correct index to callback
checkbutton1.deselect()
checkbutton1.grid(row=ii+1, column=4, ipadx=0, ipady=0, rowspan=1, sticky=tk.N+tk.E+tk.S+tk.W)
checkbutton2 = tk.Checkbutton(mywindow, text='NO', onvalue='NO', variable=v[ii],
bg="red", fg="black", font=("times", 10), width=3, anchor="w",
command=lambda i=ii: close_no(i))
checkbutton2.deselect()
checkbutton2.grid(row=ii+1, column=5, ipadx=0, ipady=0, rowspan=1, sticky=tk.N+tk.E+tk.S+tk.W)