对在tkinter中绑定回车键感到困惑

时间:2019-04-07 14:45:42

标签: python-3.x 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)(用于按钮)。出于某种原因,entry bind函数需要一个参数,我只想解释为什么是这样?即使该参数中的任何内容都没有被调用。

2 个答案:

答案 0 :(得分:2)

您可以使用

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 :(得分:1)

您可以在{p>中使用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)