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