2017-07-18 224 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使用的唯一綁定。 –

相關問題