Tkinter将按钮按压绑定到函数

0 投票
2 回答
51 浏览
提问于 2025-04-12 06:18

我有一个用户界面,上面有一个输入框和一个按钮,这个按钮可以根据输入框的内容执行多个功能。

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)

撰写回答