将<Return>绑定到按钮不能按预期工作

Tho*_*mas 6 python bind tkinter button

我将事件绑定<Return>到一个Button,认为这会导致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)
Run Code Online (Sandbox Code Playgroud)

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

unu*_*tbu 13

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

如果要Return在GUI窗口中的任何位置工作,请进行更改

self.button1.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)

root.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)

哪里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()
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用

    button.bind('<Return>', self.search)
    button.focus()
Run Code Online (Sandbox Code Playgroud)

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


关于使用*args**kwargs:

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

何时**kwargs在函数定义中使用如下:

def __init__(self, master, **kwargs):
Run Code Online (Sandbox Code Playgroud)

我们实例化SimpleApp如下:

app = SimpleApp(root, title = 'Hello, world')
Run Code Online (Sandbox Code Playgroud)

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

kwargs然后传递给Frame:

frame = tk.Frame(master, **kwargs)
Run Code Online (Sandbox Code Playgroud)

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

frame = tk.Frame(master, title = 'Hello, world')
Run Code Online (Sandbox Code Playgroud)

由于Frame可以采用大量关键字参数,并且我不完全了解它们并且不希望枚举它们,因此使用它是有利的**kwargs.另请注意,即使Frame稍后添加了新的关键字参数,我的代码仍然可以正常工作,而如果我明确地拼写出关键字,那么如果Frame允许的关键字发生变化,我的代码就不会自动"升级" .

*args同样,允许您包含任意位置参数search:

def search(self,*args):
Run Code Online (Sandbox Code Playgroud)

Python的设定args包含所有发送到位置参数列表searchsearch被调用.

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

当你说

button = tk.Button(frame, text = 'search', command = self.search)
Run Code Online (Sandbox Code Playgroud)

self.search()单击按钮时调用没有任何参数.但是当你说的时候

    button.bind('<Return>', self.search)
Run Code Online (Sandbox Code Playgroud)

self.search(event)Return按下键时调用一个参数.event是一个Tkinter.Event,它具有属性(时间,状态,类型,小部件,x,y等),可以让您更多地了解发生了什么事件.

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

def search(self, event = None):
    ...
Run Code Online (Sandbox Code Playgroud)

这可以说明search可以传递0或1个参数,而不是简单和任意数量的参数.event如果事件传递给它,它也可以更容易地访问search.

参考: