如何使用Enter键调用按钮命令

时间:2018-08-21 16:10:06

标签: python python-3.x tkinter

在tkinter中,当按钮具有焦点时,可以按空格键以执行与该按钮关联的命令。我试图使按Enter键做同样的事情。我确定我过去曾经做过,但是我找不到代码,而我现在正在做的事情没有用。我在Mac上使用的是Python 3.6.1。

这是我尝试过的

self.startButton.bind('<Return>', self.startButton.invoke)

按Enter键无效,但按空格键将激活绑定到self.startButton的命令。我尝试以相同的结果绑定到<KeyPress-KP_Enter>

我还尝试仅绑定到要执行的命令:

self.startButton.bind('<Return>', self.start)

,但结果相同。

编辑

这里有个小脚本,展示了我在说的行为。

import tkinter as tk

root = tk.Tk() 
def start():
    print('started')
    startButton.configure(state=tk.DISABLED)
    clearButton.configure(state=tk.NORMAL)

def clear():
    print('cleared')
    clearButton.configure(state=tk.DISABLED)
    startButton.configure(state=tk.NORMAL)    

frame = tk.Frame(root)
startButton = tk.Button(frame, text = 'Start', command = start, state=tk.NORMAL)
clearButton = tk.Button(frame, text = 'Clear', command = clear, state = tk.DISABLED)
startButton.bind('<Return>', start) 
startButton.pack()
clearButton.pack()
startButton.focus_set()  
frame.pack() 
root.mainloop()

在这种情况下,当我按空格键时它起作用,而当我按Enter键时失败。当我按Enter键时,我收到一条错误消息,说那里传递了一个参数,但没有要求。当我更改采用虚拟参数的定义时,按Enter即可,但是由于缺少参数,按空格键失败。

我在理解wizzwizz4的答案如何同时起作用时遇到了麻烦。另外,在我的实际脚本中按Enter键时也没有看到错误消息,但是发布的时间太长了。

**再次编辑**

我只是忽略了Mike-SMT脚本中的None的默认值。这使事情变得简单。

2 个答案:

答案 0 :(得分:3)

这仅在按钮具有键盘焦点时有效。另外,代表事件对象的参数将传递给提供的可调用对象。前者似乎不是问题,所以请尝试:

self.startButton.bind('<Return>', lambda e: self.startButton.invoke())

答案 1 :(得分:3)

您使用self.startButton.bind('<Return>', self.start)应该可以正常工作,只要补偿绑定将发送到函数/方法的event

这是一个简单的示例,只要按钮具有焦点,该示例就可以使用Enter键。

import tkinter as tk


root = tk.Tk()

def do_something(event=None):
    print("did something!")

btn = tk.Button(root, text="Do something", command=do_something)
btn.pack()
btn.bind("<Return>", do_something)
#root.bind("<Return>", do_something) will work without the button having focus.

root.mainloop()