我绑定(bind)了事件<Return>
到一个按钮,认为这会导致 command
在点击 Enter 后运行:
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)
但它什么也没做。我必须为self.search
做什么在按下 Enter 时运行?
最佳答案
您的代码看起来不错,但请注意,如果您希望 Return
调用 self.search()
,焦点必须位于按钮上。您可以通过按 Tab
将焦点从一个小部件切换到另一个小部件。焦点中的小部件用细黑线勾勒出轮廓。在按 Return
之前,您可能需要按一次或多次 Tab
以将焦点移动到按钮。
如果你想让 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
设置为包含关键字参数的字典,例如{'title':'Hello, world'}
.请注意,**kwargs
是 Python 语法,只能用于函数定义和函数调用(见下文),但 kwargs
本身只是一个字典。
kwargs
然后传递给 Frame
:
frame = tk.Frame(master, **kwargs)
现在,当在函数调用中使用 **kwargs 时,kwargs
字典中的键值对得到扩展,因此上述函数调用等同于
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
键时使用一个参数调用。 事件
是一个 Tkinter.Event它具有属性(时间、状态、类型、小部件、x、y 等),可让您详细了解发生了什么事件。
定义 search
的另一种也许更好的方法是
def search(self, event = None):
...
这会清楚地表明 search
可以传递 0 或 1 个参数,而不是简单和任意数量的参数。如果将事件传递给 search
,它还可以更轻松地访问 event
。
引用:
关于python - 将 <Return> 绑定(bind)到按钮未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8679453/