如何将输入键绑定到 tkinter 按钮
Posted
技术标签:
【中文标题】如何将输入键绑定到 tkinter 按钮【英文标题】:How to bind enter key to a tkinter button 【发布时间】:2018-05-08 14:48:21 【问题描述】:我正在尝试将 Enter 键 与 按钮 绑定。
在下面的代码中,我试图从条目小部件中获取条目,
当按下按钮bt
时,它会调用enter()
方法来获取条目。
我还希望通过按 Enter 键来调用它,但我没有得到想要的结果。
没有读取在条目小部件中输入的值,并且调用了 enter 方法,并且在我的数据库中插入了一个空白空间
帮我解决问题,谢谢!
from tkinter import *
import sqlite3
conx = sqlite3.connect("database_word.db")
def count_index():
cur = conx.cursor()
count = cur.execute("select count(word) from words;")
rowcount = cur.fetchone()[0]
return rowcount
def enter(): #The method that I am calling from the Button
x=e1.get()
y=e2.get()
ci=count_index()+1
conx.execute("insert into words(id, word, meaning) values(?,?,?);",(ci,x,y))
conx.commit()
fr =Frame() #Main
bt=Button(fr) #Button declaration
fr.pack(expand=YES)
l1=Label(fr, text="Enter word").grid(row=1,column=1)
l2=Label(fr, text="Enter meaning").grid(row=2,column=1)
e1=Entry(fr)
e2=Entry(fr)
e1.grid(row=1,column=2)
e2.grid(row=2,column=2)
e1.focus()
e2.focus()
bt.config(text="ENTER",command=enter)
bt.grid(row=3,column=2)
bt.bind('<Return>',enter) #Using bind
fr.mainloop()
【问题讨论】:
就像按钮command
一样,bind 也接受函数的引用,而不是调用函数本身。将enter()
更改为enter
inbt.bind
。
除了 Nae 的评论之外,我认为您希望将 <Return>
绑定到条目,而不是没有键盘焦点的按钮。
我也尝试使用绑定到条目。没有用,并且在通过按 两件事:
您需要修改您的函数以接受bind
传递的参数。 (你不需要使用它,但你需要接受它)。
def enter(event=None):
您需要将函数而不是结果传递给bind
方法。所以放弃()
。
bt.bind('<Return>',enter)
请注意,这会将 Return 绑定到 Button,因此如果其他东西有焦点,那么这将不起作用。您可能希望将此绑定到 Frame。
fr.bind('<Return>',enter)
如果您想要一种方法来推动焦点按钮,空格键已经做到了。
【讨论】:
我试过去掉(),还是不行。请帮忙。 @Rahul 你做了我提到的第一件事并将event=None
添加到函数定义中吗?
@Rahul “它仍然不起作用”并没有告诉我太多。 什么不起作用?你得到什么错误?
哇哦!有效。我没有在方法定义中添加 event=None 。这就是问题所在。
这是之前的问题 - 没有显示错误,只是在我的数据库中插入了一个 NULL,这意味着该方法运行良好,但无法从条目中获取值,或者它被调用在输入之前。我还必须说,如果单击按钮,程序会按预期工作。【参考方案2】:
在问题和 Novel 的回答中,首先,按钮使用 bt.config(text="ENTER",command=enter)
绑定到 enter
函数。之后,功能就和回车键绑定了,但其实按钮和回车键还是相当独立的。
在这个问题的情况下,我认为这不是一个真正的问题,但是如果您经常想更改按钮的命令,那么每次都必须更改与回车键的绑定可能会很无聊.
所以你可能会想:有没有办法让回车键自动和按钮一样的命令?
是的,有!
Tkinter Button 有invoke()
方法,调用按钮的命令并返回命令的返回值:
import tkinter as TK
def func():
print('the function is called!')
root = TK.Tk()
button= TK.Button(root, text='call the function', command=func) # not func()!
button.pack()
button.invoke() # output: 'the function is called!'
root.mainloop()
我们可以简单地将这个方法绑定到回车键:
root.bind('<Return>', button.invoke) # again without '()'!
但是等等,这会产生与以前相同的问题:button.invoke()
方法不接受绑定中的 event
参数,但我们不能(轻松)更改该方法。解决方案是使用 lambda:
root.bind('<Return>', lambda event=None: button.invoke()) # This time *with* '()'!!!
为了完整起见,我将在下面举一个例子:
import tkinter as TK
root = TK.Tk()
button= TK.Button(root)
button.pack()
def func1():
print('func1 is called!')
button.config(text='call func2', command=func2)
def func2():
print('func2 is called!')
button.config(text='call func1', command=func1)
root.bind('<Return>', lambda event=None: button.invoke())
root.mainloop()
解释:
当您第一次按回车键或单击按钮时,'func1 is called!'将被打印。 第二次按回车键或单击按钮时,'func2 is called!'将被打印。回车键应该和按钮一样,虽然键的绑定没有改变。【讨论】:
以上是关于如何将输入键绑定到 tkinter 按钮的主要内容,如果未能解决你的问题,请参考以下文章
如何将空格键键绑定到tkinter(python)中的某个方法