bind_class和lambda不能正常工作

时间:2017-07-18 10:21:13

标签: python tkinter

我遇到bind_class函数问题。

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不会继续引用line对象,而是总是返回cat_list中的最后一行'。

示例:如果cat_list = [1,2,3,4,5]i将始终在我的函数“sqlite.update_category_name”中返回5,而不是分别返回1,2,3,4,5

1 个答案:

答案 0 :(得分: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))