Cherry
Cherry

Reputation: 191

Confused about binding the enter key in tkinter

This is a search bar program and once enter is hit it will open google with whatever I searched:

import tkinter as tk
from tkinter import ttk
import webbrowser

root = tk.Tk()
root.title("Search Bar")

label1 = ttk.Label(root, text="Query")
label1.grid(row=0, column=0)
entry1 = ttk.Entry(root, width=50)
entry1.grid(row=0, column=1)


def callback():
    webbrowser.open("http://google.com/search?q="+entry1.get())


def get(event):
    webbrowser.open("http://google.com/search?q=" + entry1.get())


button1 = ttk.Button(root, text="Search", width=10, command=callback)
button1.grid(row=0, column=2)

entry1.bind("<Return>", get)

root.mainloop()

What I'm most confused about is why did I need a second function [get(event)] in order to bind the enter key at entry1.bind("<Return>", get). Why couldn't I just put entry1.bind("<Return>", callback) (which is for the button). For some reason, the enter bind function requires a parameter and I'd just like an explanation as to why that is? Even though whatever is in the parameter is not being called.

Upvotes: 0

Views: 82

Answers (2)

furas
furas

Reputation: 143098

You can use event=None in

def callback(event=None): 

and then you can use with command= and bind()

bind() will run it with event, command= will run it without event and it will use None

import tkinter as tk
from tkinter import ttk
import webbrowser

def callback(event=None):
    webbrowser.open("http://google.com/search?q="+entry1.get())

root = tk.Tk()
root.title("Search Bar")

label1 = ttk.Label(root, text="Query")
label1.grid(row=0, column=0)

entry1 = ttk.Entry(root, width=50)
entry1.grid(row=0, column=1)

button1 = ttk.Button(root, text="Search", width=10, command=callback)
button1.grid(row=0, column=2)

entry1.bind("<Return>", callback)

root.mainloop()

bind() can be used with different events and objects so it send this information to function - ie. event.widget - so you can bind the same function to different objects.

def callback(event=None):
    print(event)
    if event: # if not None
        print(event.widget)

Upvotes: 1

user10474264
user10474264

Reputation:

You can use

def callback(event=None):

Or u can pass None as parameter

import tkinter as tk
from tkinter import ttk
import webbrowser

root = tk.Tk()
root.title("Search Bar")

label1 = ttk.Label(root, text="Query")
label1.grid(row=0, column=0)
entry1 = ttk.Entry(root, width=50)
entry1.grid(row=0, column=1)


def callback():
    webbrowser.open("http://google.com/search?q="+entry1.get())


def get(event):
    webbrowser.open("http://google.com/search?q=" + entry1.get())


button1 = ttk.Button(root, text="Search", width=10, command=lambda x=None:get(x))
button1.grid(row=0, column=2)

entry1.bind("<Return>", get)

root.mainloop()

Upvotes: 1

Related Questions