Python 如何使用enter键调用按钮命令

Python 如何使用enter键调用按钮命令,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,在tkinter中,当按钮具有焦点时,可以按空格键执行与该按钮关联的命令。我试着让按下回车键做同样的事情。我肯定我以前做过,但我找不到代码,我现在做的也不管用。我正在Mac上使用python 3.6.1 这是我试过的 self.startButton.bind('<Return>', self.startButton.invoke) 但结果是一样的 编辑 这是一个展示我所说行为的小脚本 import tkinter as tk root = tk.Tk() def start(

在tkinter中,当按钮具有焦点时,可以按空格键执行与该按钮关联的命令。我试着让按下回车键做同样的事情。我肯定我以前做过,但我找不到代码,我现在做的也不管用。我正在Mac上使用python 3.6.1

这是我试过的

self.startButton.bind('<Return>', self.startButton.invoke)
但结果是一样的

编辑

这是一个展示我所说行为的小脚本

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()
将tkinter作为tk导入
root=tk.tk()
def start():
打印('已开始')
startButton.configure(状态=tk.DISABLED)
clearButton.configure(状态=tk.NORMAL)
def clear():
打印('已清除')
clearButton.configure(状态=tk.DISABLED)
startButton.configure(状态=tk.NORMAL)
frame=tk.frame(根)
startButton=tk.Button(框架,文本='Start',命令=Start,状态=tk.NORMAL)
clearButton=tk.Button(框架,文本='Clear',命令=Clear,状态=tk.DISABLED)
开始按钮。绑定(“”,开始)
startButton.pack()
clearButton.pack()
开始按钮。焦点设置()
frame.pack()
root.mainloop()
在这种情况下,它在我按空格键时工作,在我按Enter键时失败。当我按Enter键时,会收到一条错误消息,说明传递了一个参数,但不需要任何参数。当我更改ToTake伪参数的定义时,按Enter键有效,但按空格键失败,因为缺少参数

我很难理解WIZWIZZ4的答案是如何让两者都起作用的。另外,当我在实际脚本中按Enter键时,我没有看到错误消息,但这太长了,无法发布

**重新编辑**


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

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

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

您使用的
self.startButton.bind(“”,self.start)
应该可以正常工作,只要补偿绑定将发送给函数/方法的
事件

下面是一个简单的例子,只要按钮有焦点,就可以使用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()
将tkinter作为tk导入
root=tk.tk()
def do_something(事件=无):
打印(“做了什么!”)
btn=tk.Button(root,text=“Do something”,command=Do\u something)
btn.pack()
绑定(“,做点什么)
#root.bind(“,do_something)将在按钮没有焦点的情况下工作。
root.mainloop()

您使用bind的方式应该是有效的——这正是您的工作方式。请提供一个例子来说明你所做的努力。@BryanOakley如果这是我所认为的,那就是一个微妙的错误。如果没有合适的例子,很难判断。OP说按下空格键可以工作,这意味着按钮有焦点。我应该在我之前的评论中说绑定会起作用,但前提是您考虑到函数将被传递一个需要考虑的参数。在这种情况下,我认为使用lambda有点过分了。一个简单的绑定函数调用同一个命令就可以了。@Mike SMT我可以说,你的函数需要程序员重述在按下按钮时应该传递给函数的参数,因为它不再使用
命令=
提供的参数,在一个特定的情况下让你的函数更简单,但在所有其他情况下则更复杂。然而,我的方法并没有在内存中创建新函数。虽然影响很小,但您的示例“成本”更高。真的在这样的GUI中思考不太可能需要担心优化一切。@ SulsPATZ如果这解决了你的问题,考虑通过点击投票按钮下方的嘀嗒来接受它。这会将它标记为已接受,将问题标记为已回答,并给我一个不错的15次重复奖励。@wizzwizz4我仍在尝试理解另一个答案。事件的默认值是我一直忽略的。现在,这正是我想要的,一旦我给了
btn
焦点,空格键也能工作,@saulspatz是的,你必须为你需要设置的任何
bind()
管理你的事件。可以告诉函数接受事件参数,也可以使用类似WIZZWIZ4的lambda。
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()