Tkinter将按钮按压绑定到函数
我有一个用户界面,上面有一个输入框和一个按钮,这个按钮可以根据输入框的内容执行多个功能。
ent = tk.Entry(frm_top, textvariable=entry_input)
btn_confirm = tk.Button(frm_inner_bot, text="Confirm", width=25, height=2, command=lambda:
[main.save_template(entry_input.get(),filedialog.askdirectory()),update_main_window(label, listbox), create_template_window.destroy()])
我希望能够通过输入框按下某个键,来实现和按钮按下时一样的功能,但我现在还没搞定。
我尝试过使用绑定命令,并用一个简单的函数填充,但没有成功。
ent.bind('<Return>', lambda:[main.save_template(entry_input.get(),filedialog.askdirectory()),update_main_window(label, listbox), create_template_window.destroy()])
我也试过直接调用按钮的按下事件,但这样做会一次性执行所有功能,而不是像按钮那样一步一步来。
ent.bind('<Return>', btn_confirm.invoke())
如果有人能告诉我哪里出错了,以及如何解决这个问题,我会非常感激。
我看了很多相关的文章和教程,但没有找到一个能解决从绑定中执行多个功能的问题。
2 个回答
0
你应该把输入框的父窗口和“回车”键绑定在一起,这样它的功能就像你把按钮和某个功能连接起来一样。比如说……
from tkinter import *
def function to be triggered(*e):
user_entry = ent.get()
# Do something
root = Tk()
root.geometry('300x200')
ent = Entry(root)
ent.pack()
root.bind('<Return>', function_to_be_triggered)
btn = Button(root, command=function_to_be_triggered)
btn.pack()
root.mainloop()
1
在你的例子中,代码 ent.bind('<Return>', btn_confirm.invoke())
会立即执行 btn_confirm.invoke()
,然后把结果(一个元组)作为绑定的回调函数。
正确的写法应该是 ent.bind('<Return>', lambda e: btn_confirm.invoke())
。
另外,在一个 lambda 函数里面调用多个函数并不是一个好习惯。更好的做法是把这些多个函数放在另一个函数里面:
def func():
main.save_template(entry_input.get(), filedialog.askdirectory())
update_main_window(label, listbox)
create_template_window.destroy()
ent = tk.Entry(frm_top, textvariable=entry_input)
ent.bind("<Return>", lambda e: func())
btn_confirm = tk.Button(frm_inner_bot, text="Confirm", width=25, height=2,
command=func)