如何将输入键绑定到 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 的评论之外,我认为您希望将 &lt;Return&gt; 绑定到条目,而不是没有键盘焦点的按钮。 我也尝试使用绑定到条目。没有用,并且在通过按 将其聚焦在按钮上后也尝试聚焦,即使这不起作用。 没有工作,你的意思是有错误还是没有达到你的预期? 没有显示错误,只是在我的数据库中插入了一个 NULL,这意味着该方法运行良好,但无法从条目中获取值,或者它是在输入之前调用。我还必须说,如果单击按钮,程序会按预期工作。 【参考方案1】:

两件事:

您需要修改您的函数以接受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)中的某个方法

将按键发送到嵌入式 Pygame

如何将回车键绑定到 tkinter 中的函数?

如何将动作绑定到 python 中的 tkinter 树视图的标题?

如何将 Enter 键连接到提交按钮

如何将回车键绑定到tkinter中的函数?