<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:times new roman,new york,times,serif;font-size:12pt">Aaahhh, got it! Peace! I did two things wrong: (1) I didn't use a tcl StringVar() to get the entry widget contents (2) I didn't consistently close the menus generated by previous attempts to run the program, which led to inconsistent results.<br><br>I'll paste the working code below. It's partially in Dutch, but hey, so is Guido van Rossem. ;-)<br><br>Even so, I'd be happy to hear suggestions for improvement or simplification. I'd love to chop the code up into smaller, more comprehensible bits.<br><br>from Tkinter import *<br><br>def createWidgets(veldnamen):<br>&nbsp;&nbsp;&nbsp; root=Tk()<br>&nbsp;&nbsp;&nbsp; termenlijst = {"Naam": set(["Bill Gates", "Elvis Presley"]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*Postcode":
 set(["2600AA", "8000BB"]),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Adres": set(["Street", "Avenue"])}<br>&nbsp;&nbsp;&nbsp; handleDeletions = {}<br>&nbsp;&nbsp;&nbsp; for veldnaam in veldnamen:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labelWidget=Label(root, text=veldnaam, takefocus=False)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labelWidget.grid()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # tcl names must start with a lowercase letter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tclName = veldnaam[0].lower() + veldnaam[1:]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content = StringVar()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget=Entry(root, name=tclName, textvariable=content)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget.grid()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def handleDeletion(event, widget=entryWidget, root=root,
 termenlijst=termenlijst,content=content):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actieveVenster = root.focus_get()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actieveVensternaam = str(actieveVenster)[1:].capitalize()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if actieveVensternaam.startswith("*"):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actieveVensternaam = "*" + actieveVensternaam[1:].capitalize()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vensterinhoud = content.get().strip()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Name: %s -- Contents: %s" % (actieveVensternaam, vensterinhoud)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 termenlijst[actieveVensternaam].remove(vensterinhoud)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actieveVenster.delete(0, END)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Deleted term '%s'" % vensterinhoud<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except KeyError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "No such term '%s'" % vensterinhoud<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleDeletions[entryWidget] = handleDeletion<br><br>&nbsp;&nbsp;&nbsp; for entryWidget, handleDeletion in handleDeletions.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget.bind("&lt;Shift-Delete&gt;", handleDeletion)<br><br>createWidgets(["Naam", "*Postcode",
 "Adres"])<br><br><br>&nbsp;<br><div>&nbsp;</div>Cheers!!<br>Albert-Jan<br><br><div>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>All right, but apart from the sanitation, the medicine, education, wine, public order, irrigation, roads, a fresh water system, and public health, what have the Romans ever done for us?<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<div><br></div><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><br><div style="font-family: times new roman,new york,times,serif; font-size: 12pt;"><font face="Tahoma" size="2"><hr size="1"><b><span style="font-weight: bold;">From:</span></b> Albert-Jan Roskam &lt;fomcl@yahoo.com&gt;<br><b><span style="font-weight: bold;">To:</span></b> Python Mailing List &lt;tutor@python.org&gt;<br><b><span style="font-weight: bold;">Sent:</span></b> Fri, December 3, 2010 11:19:02 AM<br><b><span style="font-weight:
 bold;">Subject:</span></b> [Tutor] Question on tkinter event binding<br></font><br>
<div style="font-family: times new roman,new york,times,serif; font-size: 12pt;">Hi,<br><br>I'm trying to make a small improvement on a data entry program and it is literally giving me a headache. I would appreciate your help or suggestions. <br><br>The actual program uses Autocomplete entry widgets [1], which is a subclass of the Tkinter Entry widget. The sample code below uses a simple Entry widget, for the sake of simplicity. The autocompletions are recorded in a dictionary of the form {entry name: set(&lt;entries&gt;)}. The problem is that entries with typos cannot be deleted, so wrong autocomplete suggestions ("Bbbilly Gates") are given until the end of time. My solution: I want to bind each entry widget to the Delete key, which makes it possible to remove the typo-entry from the set of entries. I am using an ' expanded event handler' [2] to do the event
 binding.<br><br>The sample code below creates two entry widgets. The problem is that the entry contents is not retrieved correctly. If I fill the 2nd entry with some text, then hit 'Del' , it shows the content of the *first* entry. Also, I would like to isolate the event handler into its own function, not as a function within a function, but I'm not quite sure how.<br><br><span><span>[1] <a target="_blank" href="http://tkinter.unpythonic.net/wiki/AutocompleteEntry">http://tkinter.unpythonic.net/wiki/AutocompleteEntry</a></span></span><br><span><span>[2] <a target="_blank" href="http://www.daniweb.com/code/snippet306072.html">http://www.daniweb.com/code/snippet306072.html</a></span></span><br><br>from Tkinter import *<br><br>def createWidgets(veldnamen):<br>&nbsp;&nbsp;&nbsp; root=Tk()<br>&nbsp;&nbsp;&nbsp; termenlijst = {"Naam": set(["Bill Gates", "Elvis Presley"]), "*Postcode": set(["2600AA", "8000NN"])}<br>&nbsp;&nbsp;&nbsp; handleDels =
 {}<br>&nbsp;&nbsp;&nbsp; for veldnaam
 in veldnamen:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # tcl names must start with lowercase letter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget=Entry(root, name=veldnaam[0].lower() + veldnaam[1:])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget.grid()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def handleDel(event, widget=entryWidget, root=root, termenlijst=termenlijst):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vensternaam = str(root.focus_get())[1:].capitalize() # ... and back to uppercase<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if vensternaam.startswith("*"):&nbsp;&nbsp;&nbsp; # mandatory fields start with '*' in my program.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vensternaam = "*" + vensternaam[1:].capitalize()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vensterinhoud =
 entryWidget.get()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Naam", vensternaam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # entry name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Inhoud", vensterinhoud&nbsp;&nbsp; # entry contents<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; termenlijst[vensternaam].remove(vensterinhoud)&nbsp; # here's where the typo is removed<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except KeyError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass # user tries to delete a term that doesn't exist in the termenlijst.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleDels[entryWidget] = handleDel<br>&nbsp;&nbsp;&nbsp; # do all the bindings (is this where it goes
 wrong??)<br>&nbsp;&nbsp;&nbsp; for entryWidget, handleDel in handleDels.iteritems():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entryWidget.bind("&lt;Delete&gt;", handleDel)<br>&nbsp;&nbsp;&nbsp; print handleDels<br>&nbsp;&nbsp;&nbsp; print termenlijst<br><br>createWidgets(["Naam", "*Postcode"])<br><div>&nbsp;<br>Thanks again for having a look at this.<br><br></div>Cheers!!<br>Albert-Jan<br><br><div>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>All right, but apart from the sanitation, the medicine, education, wine, public order, irrigation, roads, a fresh water system, and public health, what have the Romans ever done for us?<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<div><br></div></div>
</div><br>

      </div></div></div>
</div><br>

      </body></html>