在Tkinter中为输入框绑定回车键执行查找替换命令
Tkinter查找替换组件:回车触发替换功能的问题解决
问题
使用Tkinter开发简易查找替换组件,点击按钮可正常执行find_and_replace函数,但尝试给“To”输入框绑定回车或Ctrl+回车触发该函数时失败,原绑定代码为:
l_to.bind("<Return>", lambda x=[e_from,e_to]: find_and_replace(x[0],x[1]) )
原因及解决方案
- 绑定对象错误:原代码将事件绑定到了“To”的标签(
l_to)上,标签无法获得输入焦点,因此按键事件不会被触发,应绑定到“To”对应的输入框e_to。 - 事件参数未处理:Tkinter事件绑定的回调函数默认会接收一个
event参数,lambda表达式需要处理该参数,否则会导致参数不匹配报错。 - 需同时绑定两个事件:要实现回车和Ctrl+回车都触发,需分别绑定
<Return>和<Control-Return>事件。
修改后的完整代码
import tkinter as tk from tkinter import ttk, messagebox win = tk.Tk() def find_and_replace(entry_from, entry_to): # Get variables str_from = entry_from.get() str_to = entry_to.get() s = 'Quick brown fox jumped.' out = s.replace(str_from, str_to) tk.Label(win, text=out).pack(pady=4) f = tk.Frame(win, height=200, width=200) f.grid(row=0, column=0, padx=20, pady=20) f.pack(fill="both", expand="yes") # label frame: Find and Replace lf00 = tk.LabelFrame(f, text='Replace this: Quick brown fox jumped.') lf00.grid(row=0, column=0, padx=(20, 2), pady=20, sticky='e') l_from = tk.Label(lf00, text='From'); l_from.grid(row=0, column=0) l_to = tk.Label(lf00, text='To'); l_to.grid(row=0, column=1) e_from = tk.Entry(lf00); e_to = tk.Entry(lf00) e_from.grid(row=1, column=0); e_to.grid(row=1, column=1) # 绑定回车和Ctrl+回车事件到To输入框 e_to.bind("<Return>", lambda event, e1=e_from, e2=e_to: find_and_replace(e1, e2)) e_to.bind("<Control-Return>", lambda event, e1=e_from, e2=e_to: find_and_replace(e1, e2)) b20 = tk.Button(lf00, text='RegexReplace', command=lambda x=[e_from,e_to]: find_and_replace(x[0],x[1])) b20.grid(row=2, column=0, sticky='w') b21 = tk.Button(lf00, text='MultiReplace', command=lambda x=[e_from,e_to]: find_and_replace(x[0],x[1])) b21.grid(row=2, column=1, sticky='e') win.mainloop()
内容的提问来源于stack exchange,提问作者dallascow
相关产品推荐
相关产品推荐

