如何将输入键绑定到tkinter按钮

时间:2017-11-24 14:58:12

标签: python button tkinter bind tkinter-entry

我正在尝试使用按钮绑定 Enter键

在下面的代码中,我试图从条目小部件中获取条目, 当按下按钮bt时,它会调用获取条目的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()

2 个答案:

答案 0 :(得分:5)

2件事:

您需要修改函数以接受bind通过的参数。 (您不需要使用它,但您需要接受它)。

def enter(event=None):

您需要将函数而不是结果传递给bind方法。所以放弃()

bt.bind('<Return>',enter)

注意这会将Return绑定到 Button ,所以如果其他东西有焦点,那么这将无效。您可能希望将其绑定到 Frame

fr.bind('<Return>',enter)

如果你想要一种方法来推动焦点按钮空格键已经这样做了。

答案 1 :(得分:1)

在问题和Novel的答案中,首先,使用enter将按钮绑定到bt.config(text="ENTER",command=enter)功能。此后,该功能绑定到Enter / Return键,但实际上,按钮和Enter / Return键仍然非常独立。

在这个问题的情况下,我认为这并不是一个真正的问题,但是如果您经常想更改按钮的命令,那么每次不得不更改与回车键的绑定可能就很无聊了。 。

所以您可能会想:是否有办法自动给Enter键 与按钮相同的命令?

是的,有!

Tkinter按钮具有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()

我们可以简单地将此方法绑定到Enter键:

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()

说明:

  • 当您第一次按Enter或单击按钮时,“ func1被调用!”将被打印。
  • 再次按Enter或单击按钮时,“ func2被调用!”将被打印。回车键应与按钮相同,尽管键的绑定没有更改。