前两天遇到一个搞了两天也解决不了的问题,最后在stackoverflow上被一个大佬帅气解救了,十分感谢!!写下来帮助有这个问题的小伙伴~
成功的代码如下:
def close_yes(i):
update_rank(solutions[ii])
tkinter.messagebox.showinfo('notice', 'Finish, thank you!')
print('close_yes:', i, v[i].get())
mywindow.destroy()
def close_no(i):
if i < len(solutions) - 1:
tkinter.messagebox.showinfo('notice', 'Please try next solution')
if i == len(solutions) - 1:
var_string = askstring(title="Tester Troubleshooter",
prompt="Please provide new solution:")
update_error_list(var_string)
tkinter.messagebox.showinfo('notice', 'Finish, thank you!')
mywindow.destroy()
print('close_no:', i, v[i].get())
v = [None] * len(solutions) # list to hold the StringVar instances
for ii in range(len(solutions)):
v[ii] = tk.StringVar()
checkbutton1 = tk.Checkbutton(mywindow, text='YES', onvalue='YES', variable=v[ii],
bg="white", fg="green", 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=5, 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="white", fg="red", font=("times", 10), width=3, anchor="w",
command=lambda i=ii: close_no(i))
checkbutton2.deselect()
checkbutton2.grid(row=ii + 1, column=6, ipadx=0, ipady=0, rowspan=1, sticky=tk.N + tk.E + tk.S + tk.W)
原来错误的代码如下:
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 = StringVar()
checkbutton1 = Checkbutton(mywindow, text='YES', onvalue='YES', variable=v, bg="red", fg="black", font=("times", 10), width=3, anchor="w", command=close_yes)
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 = Checkbutton(mywindow, text='NO', onvalue='NO', variable=v, bg="red", fg="black", font=("times", 10), width=3, anchor="w", command=close_no)
checkbutton2.deselect()
checkbutton2.grid(row=ii+1, column=5, ipadx=0, ipady=0, rowspan=1, sticky=tk.N+tk.E+tk.S+tk.W)
界面如下:
我的问题在于,通过for循环每个for循环建立一个YES和一个NO按钮,但是不管我按哪个按钮,得到的都是最后一个for循环产生的按钮的值。
后来大佬帮忙加了Lambda函数,就好了!!!
跪谢!
有需要的小伙伴可以参考一下!