How do I bind the enter key to a function in tkinter? How do I bind the enter key to a function in tkinter? tkinter tkinter

How do I bind the enter key to a function in tkinter?


Try running the following program. You just have to be sure your window has the focus when you hit Return--to ensure that it does, first click the button a couple of times until you see some output, then without clicking anywhere else hit Return.

import tkinter as tkroot = tk.Tk()root.geometry("300x200")def func(event):    print("You hit return.")root.bind('<Return>', func)def onclick():    print("You clicked the button")button = tk.Button(root, text="click me", command=onclick)button.pack()root.mainloop()

Then you just have tweak things a little when making both the button click and hitting Return call the same function--because the command function needs to be a function that takes no arguments, whereas the bind function needs to be a function that takes one argument(the event object):

import tkinter as tkroot = tk.Tk()root.geometry("300x200")def func(event):    print("You hit return.")def onclick(event=None):    print("You clicked the button")root.bind('<Return>', onclick)button = tk.Button(root, text="click me", command=onclick)button.pack()root.mainloop()

Or, you can just forgo using the button's command argument and instead use bind() to attach the onclick function to the button, which means the function needs to take one argument--just like with Return:

import tkinter as tkroot = tk.Tk()root.geometry("300x200")def func(event):    print("You hit return.")def onclick(event):    print("You clicked the button")root.bind('<Return>', onclick)button = tk.Button(root, text="click me")button.bind('<Button-1>', onclick)button.pack()root.mainloop()

Here it is in a class setting:

import tkinter as tkclass Application(tk.Frame):    def __init__(self):        self.root = tk.Tk()        self.root.geometry("300x200")        tk.Frame.__init__(self, self.root)        self.create_widgets()    def create_widgets(self):        self.root.bind('<Return>', self.parse)        self.grid()        self.submit = tk.Button(self, text="Submit")        self.submit.bind('<Button-1>', self.parse)        self.submit.grid()    def parse(self, event):        print("You clicked?")    def start(self):        self.root.mainloop()Application().start()


Another alternative is to use a lambda:

ent.bind("<Return>", (lambda event: name_of_function()))

Full code:

from tkinter import *from tkinter.messagebox import showinfodef reply(name):    showinfo(title="Reply", message = "Hello %s!" % name)top = Tk()top.title("Echo")top.iconbitmap("Iconshock-Folder-Gallery.ico")Label(top, text="Enter your name:").pack(side=TOP)ent = Entry(top)ent.bind("<Return>", (lambda event: reply(ent.get())))ent.pack(side=TOP)btn = Button(top,text="Submit", command=(lambda: reply(ent.get())))btn.pack(side=LEFT)top.mainloop()

As you can see, creating a lambda function with an unused variable "event" solves the problem.


I found one good thing about using bind is that you get to know the trigger event: something like: "You clicked with event = [ButtonPress event state=Mod1 num=1 x=43 y=20]" due to the code below:

self.submit.bind('<Button-1>', self.parse)def parse(self, trigger_event):        print("You clicked with event = {}".format(trigger_event))

Comparing the following two ways of coding a button click:

btn = Button(root, text="Click me to submit", command=(lambda: reply(ent.get())))btn = Button(root, text="Click me to submit")btn.bind('<Button-1>', (lambda event: reply(ent.get(), e=event)))def reply(name, e = None):    messagebox.showinfo(title="Reply", message = "Hello {0}!\nevent = {1}".format(name, e))

The first one is using the command function which doesn't take an argument, so no event pass-in is possible.The second one is a bind function which can take an event pass-in and print something like "Hello Charles! event = [ButtonPress event state=Mod1 num=1 x=68 y=12]"

We can left click, middle click or right click a mouse which corresponds to the event number of 1, 2 and 3, respectively. Code:

btn = Button(root, text="Click me to submit")buttonClicks = ["<Button-1>", "<Button-2>", "<Button-3>"]for bc in buttonClicks:    btn.bind(bc, lambda e : print("Button clicked with event = {}".format(e.num)))

Output:

Button clicked with event = 1Button clicked with event = 2Button clicked with event = 3