Смущен привязкой клавиши ввода в tkinter - PullRequest
0 голосов
/ 07 апреля 2019

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

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

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

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()
1 голос
/ 07 апреля 2019

Вы можете использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...