Python Tkinter Entry.get()返回前一次输入值的问题如何解决?
问题根因
validate="key"对应的validatecommand回调设计为输入内容修改前触发,作用是判断本次输入是否合法,只有回调返回True时内容才会真正写入Entry组件,因此回调内直接调用E.get()只能拿到修改前的旧值。
解决方案
方案1:使用validatecommand内置参数获取新值(推荐,保留校验能力)
tkinter为validatecommand提供了预设占位符参数,无需修改原有校验逻辑即可直接拿到修改后的预期值,修改方式如下:
import tkinter as tk root = tk.Tk() root.geometry('200x200') def doStuff(new_val): # 直接使用传入的new_val即可拿到最新输入 pass def callback(new_val): print(new_val) doStuff(new_val) return True E = tk.Entry( root, bg="white", fg="black", width=24, validate="key", # 先通过root.register注册回调,%P代表本次修改生效后输入框的预期内容 validatecommand=(root.register(callback), '%P') ) E.grid(row=0, column=0, padx=30, pady=5, sticky=tk.E) root.mainloop()
方案2:绑定StringVar变量变化监听(无需校验时更简便)
如果你不需要对输入做合法性校验,仅需要内容更新完成后触发逻辑,可直接给绑定的StringVar添加变化监听,该事件会在内容写入完成后触发:
import tkinter as tk root = tk.Tk() root.geometry('200x200') def doStuff(new_val): pass sv = tk.StringVar() def callback(*args): # 此处sv.get()或E.get()均可拿到最新输入值 current_val = sv.get() print(current_val) doStuff(current_val) # 监听StringVar的写入操作 sv.trace_add('write', callback) E = tk.Entry(root, bg="white", fg="black", width=24, textvariable=sv) E.grid(row=0, column=0, padx=30, pady=5, sticky=tk.E) root.mainloop()
方案3:绑定键盘释放事件(适配特定场景)
如果你的逻辑仅需要响应键盘输入的修改,可绑定<KeyRelease>事件,触发时输入内容已经完成更新:
def callback(event): print(E.get()) doStuff() E.bind('<KeyRelease>', callback)
该方案的缺陷是右键粘贴、代码主动修改内容的场景不会触发,优先选择前两种方案。
内容的提问来源于stack exchange,提问作者Sleepi
相关产品推荐
相关产品推荐

