Reputation: 191
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
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
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