Запутался в привязке клавиши ввода в tkinter

Это программа панели поиска, и после нажатия 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) (это для кнопки). По какой-то причине для функции ввода привязки требуется параметр, и я просто хотел бы объяснить, почему это так? Даже если все, что находится в параметре, не вызывается.

вы можете использовать def callback(event=None):, а затем вы можете использовать с command= и bind()

furas 07.04.2019 17:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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)

Ах, теперь я вижу, спасибо за разъяснение, это действительно полезно

Cherry 07.04.2019 17:16

Вы можете использовать

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()

Таким образом, вам вовсе не нужны две функции.

user10474264 07.04.2019 17:11

Другие вопросы по теме