Это программа панели поиска, и после нажатия Enter она откроет Google с тем, что я искал:
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()
Что меня больше всего смущает, так это то, почему мне понадобилась вторая функция [get(event)] для привязки клавиши ввода к entry1.bind("<Return>", get)
. Почему я не мог просто поставить entry1.bind("<Return>", callback)
(это для кнопки). По какой-то причине для функции ввода привязки требуется параметр, и я просто хотел бы объяснить, почему это так? Даже если все, что находится в параметре, не вызывается.
Вы можете использовать event=None
в
def callback(event=None):
а затем вы можете использовать с command=
и bind()
bind()
запустит его с event
, command=
запустит без события и будет использовать 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()
может использоваться с различными событиями и объектами, поэтому он отправляет эту информацию в функцию, т.е. event.widget
- чтобы вы могли привязать одну и ту же функцию к разным объектам.
def callback(event=None):
print(event)
if event: # if not None
print(event.widget)
Ах, теперь я вижу, спасибо за разъяснение, это действительно полезно
Вы можете использовать
def callback(event=None):
Или вы можете передать None в качестве параметра
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()
Таким образом, вам вовсе не нужны две функции.
вы можете использовать
def callback(event=None):
, а затем вы можете использовать сcommand=
иbind()