绑定<return>到按钮没有按预期工作</return>

时间:2011-12-30 12:29:45

标签: python button tkinter bind

我将事件<Return>绑定到一个Button,认为这会导致在点击 Enter 后运行command

Button(self.f, text="Print", command=self.Printer).pack(side=RIGHT, padx=10, pady=10)
self.button1 = Button(self.f, text="search", command=self.search)
self.button1.bind('<Return>', self.search)
self.button1.pack(side=RIGHT, padx=10, pady=10)

但它没有做任何事情。当按下 Enter 时,我必须做什么才能运行self.search

1 个答案:

答案 0 :(得分:13)

您的代码看起来很好,但请注意,如果您希望Return拨打self.search(),则必须关注该按钮。您可以按Tab将焦点从小部件更改为小部件。焦点小部件用黑色细线勾勒出轮廓。在按Tab之前,您可能需要按Return一次或多次才能将焦点移至按钮。

如果您希望Return在GUI窗口中的任何位置工作,请更改

self.button1.bind('<Return>', self.search)

root.bind('<Return>', self.search)

其中root = tk.Tk()

例如,在下面的代码中将button.bindmaster.bind进行比较:

import Tkinter as tk

class SimpleApp(object):
    def __init__(self, master, **kwargs):
        title = kwargs.pop('title')
        frame = tk.Frame(master, **kwargs)
        frame.grid()
        button = tk.Button(frame, text = 'search', command = self.search)
        button.grid()
        button.bind('<Return>', self.search)
        # uncomment if you want `<Return>` bound everywhere.
        # master.bind('<Return>', self.search)  
    def search(self,*args):
        print('searching...')

def basic():
    root = tk.Tk()
    app = SimpleApp(root, title = 'Hello, world')
    root.mainloop()

basic()

或者,您可以使用

    button.bind('<Return>', self.search)
    button.focus()

这样做,只有在按钮具有焦点时才按Return调用self.search(),但按钮会在应用开始时获得焦点。


关于*args**kwargs的使用:

**kwargs允许将任意关键字参数传递给__init__

在函数定义中使用**kwargs时,如下所示:

def __init__(self, master, **kwargs):

我们像这样实例化SimpleApp

app = SimpleApp(root, title = 'Hello, world')

然后Python将kwargs设置为包含关键字参数的dict,例如{'title':'Hello, world'}。请注意**kwargs是Python语法,只能用于函数定义和函数调用(见下文),但kwargs本身只是一个字典。

kwargs然后传递给Frame

frame = tk.Frame(master, **kwargs)

现在,当在函数调用中使用** kwargs时,kwargs dict中的键值对会被扩展,以便上面的函数调用等同于

frame = tk.Frame(master, title = 'Hello, world')

由于Frame可以使用大量关键字参数,并且我不知道它们全部并且不希望枚举它们,因此使用**kwargs是有利的。 另请注意,即使稍后将新的关键字参数添加到Frame,我的代码仍然可以正常工作,而如果我明确地拼写出关键字,那么如果Frame我的代码不会自动“升级”允许的关键词会改变。

类似地,

*args允许您将任意位置参数包含到search

def search(self,*args):

Python将args设置为一个列表,其中包含调用search时发送到search的所有位置参数。

我在这里使用了* args,因为self.search被调用时没有参数或一个参数。

当你说

button = tk.Button(frame, text = 'search', command = self.search)
单击按钮时,调用

self.search()时没有任何争论。但是当你说

    button.bind('<Return>', self.search)
按下self.search(event)键时,使用一个参数调用

Returnevent是一个Tkinter.Event,它具有属性(时间,状态,类型,小部件,x,y等),可让您了解有关发生的事件的更多信息。

定义search的另一种可能更好的方法是

def search(self, event = None):
    ...

这可以清楚地表明search可以传递0或1个参数,而不是简单和任意数量的参数。如果将事件传递给event,它也可以更轻松地访问search

参考: