def shortcut_for_underlining_text(widget, callback, ignore_case=True): text = widget.cget("text") if text == "": raise Exception("No text for widget") underline = widget.cget("underline") if underline == -1: raise Exception("No underline found on widget text") toplevel = widget.winfo_toplevel() char = text[underline] if ignore_case: hotkey = ""%char.lower() toplevel.bind(hotkey, callback) hotkey = ""%char.upper() toplevel.bind(hotkey, callback) else: hotkey = ""%char toplevel.bind(hotkey, callback) def create_buddy(label, partner, ignore_case=True): shortcut_for_underlining_text(label, lambda event: partner.focus(), ignore_case=ignore_case) def create_shortcut_to_button(button, ignore_case=True): shortcut_for_underlining_text(button, lambda event: button.invoke(), ignore_case=ignore_case) if __name__ == "__main__": try: from Tkinter import Tk, Label, Entry, Toplevel, Button from tkMessageBox import showinfo except ImportError: from tkinter import Tk, Label, Entry, Toplevel, Button from tkinter.messagebox import showinfo root = Tk() root.wm_title("Login") l= Label(root, text="User Name:", underline=5) l.grid(row=0, column=0) e = Entry(root) e.grid(row=0, column=1) create_buddy(l,e) l= Label(root, text="Password:", underline=0) l.grid(row=1, column=0) e = Entry(root) e.grid(row=1, column=1) create_buddy(l,e) def login(): showinfo("Login","Executed login callback") button = Button(root, text="Log in", command=login, underline=0) button.grid(row=2, column=0) create_shortcut_to_button(button) dialog = Toplevel(root) dialog.wm_title("Sign up") l= Label(dialog, text="Name:", underline=0) l.grid(row=0, column=0) e = Entry(dialog) e.grid(row=0, column=1) create_buddy(l,e) l= Label(dialog, text="Address:", underline=0) l.grid(row=1, column=0) e = Entry(dialog) e.grid(row=1, column=1) create_buddy(l,e) l= Label(dialog, text="Telephone:", underline=0) l.grid(row=2, column=0) e = Entry(dialog) e.grid(row=2, column=1) create_buddy(l,e) root.mainloop()