2017-07-18 1 views
-2

Ich habe ein Problem mit der Funktion bind_class.bind_class und Lambda funktioniert nicht gut

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']) 

die Linie ent.bindtags(tagList=['Entry', 'add_cat']) funktioniert gut. Entry ist für das Verhalten von Entry und add_cat wird für Scrollbar-Bindung verwendet.

Das Problem ist in der nächsten Zeile, da Lambda den Verweis auf das Linienobjekt nicht behält, sondern immer die letzte 'Zeile' in cat_list zurückgibt.

Beispiel: Wenn cat_list = [1,2,3,4,5] wird i immer wieder zurückkehren 5 in meiner Funktion "sqlite.update_category_name" anstelle von 1,2,3,4,5 bzw.

Antwort

0

Wie der Name schon sagt, bind_class bindet an eine Klasse von Widgets, kein einziges Widget. Jedes Mal, wenn Sie innerhalb einer Schleife bind_class anrufen, ersetzen Sie alle vorherigen Anrufe durch bind_class.

Wenn Sie möchten, dass jedes Widget eine eindeutige Bindung hat, verwenden Sie bind anstatt bind_class.

+0

Ich habe versucht, es hat überhaupt nicht funktioniert, das war mein erster Versuch, bind statt bind_class, aber es hat nicht funktioniert. Es war wie ... ent.bindtags (tagList = ['Eintrag', 'add_cat']) ent.bind ("", Lambda-Ereignis, Zeile = Zeile, ent = ent: sqlite.update_category_name (Ereignis, (db, line, ent)) aber keine Effekte, eigentlich keine Aufrufe für Funktion überhaupt –

+0

was ich nicht verstehe ist, warum bind_class macht Lambda nicht funktioniert gut –

+0

@ DušanAtanacković: es ist, weil Sie Ihre Bindung bei jeder Iteration von überschreiben die Schleife. Eine Klassenbindung ist eine _single_ Bindung für eine _class_ von Widgets. Es hat nichts mit 'Lambda' zu tun. Dies ist einfach der Fall, dass das letzte Mal, wenn Sie 'bind_class' aufrufen, die einzige Bindung ist, die von tkinter verwendet wird. –