我将事件<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
?
答案 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.bind
与master.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)
键时,使用一个参数调用 Return
。 event
是一个Tkinter.Event,它具有属性(时间,状态,类型,小部件,x,y等),可让您了解有关发生的事件的更多信息。
定义search
的另一种可能更好的方法是
def search(self, event = None):
...
这可以清楚地表明search
可以传递0或1个参数,而不是简单和任意数量的参数。如果将事件传递给event
,它也可以更轻松地访问search
。
参考: