bind_class和lambda不能很好地工作
问题描述:
我有一个bind_class函数的问题。bind_class和lambda不能很好地工作
for line in cat_list: # insert category into Text widget
fr = Frame(ft, bg='purple', width=200)
fr.pack(expand=1, fill=BOTH)
ent = Entry(fr, width=35, bg='orange', fg='white')
ent.pack(side='left', expand=1, fill=BOTH)
ent.insert(0, line[1])
ent.bindtags(tagList=['Entry', 'add_cat'])
ent.bind_class('add_cat', "<Return>", lambda event, line=line, ent=ent: sqlite.update_category_name(event, db, line, ent))
imgsd = pil_image('imgs/required/btns/ch_pic.png', 30, 30)
img_location = Button(fr, image=imgsd, borderwidth=2, relief="groove", fg='white', anchor='w', command=lambda line3=line:chPic(line3))
img_location.image = imgsd
img_location.pack(side='left', expand=0, fill=BOTH)
img_location.bindtags(tagList=['Button', 'add_cat'])
该行ent.bindtags(tagList=['Entry', 'add_cat'])
工作正常。 Entry
用于Entry的行为,add_cat
用于滚动条绑定。
问题出现在下一行,因为lambda不保持对线对象的引用,而是始终返回cat_list中的最后一行。
例如:如果cat_list = [1,2,3,4,5]
,i
将永远在我的功能“sqlite.update_category_name”返回5,而不是1,2,3,4,5分别
答
,因为它的名字所暗示的,bind_class
结合到类的小部件,而不是一个小部件。每次在循环中呼叫bind_class
时,都会将以前的任何呼叫替换为bind_class
。
如果您希望每个小部件具有唯一的绑定,请使用bind
而不是bind_class
。
ent.bind("<Return>", lambda event, line=line, ent=ent: sqlite.update_category_name(event, db, line, ent))
我试过了,它根本不起作用,那是我的第一次尝试,绑定而不是bind_class,但它不起作用。它就像... ent.bindtags(tagList = ['Entry','add_cat']) ent.bind(“”,lambda event,line = line,ent = ent:sqlite.update_category_name(event, db,line,ent)) 但没有效果,实际上根本没有调用函数 –
我不明白的是,为什么bind_class让lambda不能正常工作 –
@DušanAtanacković:这是因为你在每次迭代时都会覆盖你的绑定循环。一个类绑定是一个_single_绑定一个_class_的小部件。它与'lambda'无关。这只是最后一次调用'bind_class'是tkinter使用的唯一绑定。 –