python - 将 <Return> 绑定(bind)到按钮未按预期工作

标签 python button tkinter bind

我绑定(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.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 设置为包含关键字参数的字典,例如{'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/

相关文章:

python - 如何使用 scikit-learn API 实现元估计器?

javascript - 如何删除 addClsOnOver 监听器 ExtJS

html - 使按钮 "Search"可点击 HTML/CSS

javascript - 试图让第二个按钮和第一个按钮一样工作

python - TKinter - 使用网格布局的框架中的小部件不是 'sticking'

python - 如何使用python保存图像?

python - 如何在 numpy 中添加附加和分隔列

python - Django 中的 Kwargs

python - Tkinter - 从 spinbox 获取值

python - 如何在 tkinter 文本框中获取正在搜索的单词的索引