2017-07-18 177 views
-2

我有一个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分别

回答

0

,因为它的名字所暗示的,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)) 
+0

我试过了,它根本不起作用,那是我的第一次尝试,绑定而不是bind_class,但它不起作用。它就像... ent.bindtags(tagList = ['Entry','add_cat']) ent.bind(“”,lambda event,line = line,ent = ent:sqlite.update_category_name(event, db,line,ent)) 但没有效果,实际上根本没有调用函数 –

+0

我不明白的是,为什么bind_class让lambda不能正常工作 –

+0

@DušanAtanacković:这是因为你在每次迭代时都会覆盖你的绑定循环。一个类绑定是一个_single_绑定一个_class_的小部件。它与'lambda'无关。这只是最后一次调用'bind_class'是tkinter使用的唯一绑定。 –

相关问题