Python Tkinter Entry无法完全清空,仅余最后一个字符
问题原因
你的lditime输入框设置了validate="key",这意味着每一次字符修改(包括删除)都会触发验证函数。而你的validate_time函数没有处理空字符串的情况,当尝试清空输入框时,空字符串不符合任何返回True的条件,验证失败,导致删除操作被Tkinter阻止。
解决方案
以下三种方法都能解决这个问题,选适合你的即可:
方法1:临时禁用验证再删除
在执行删除操作前,先关闭输入框的验证,删除完成后再恢复验证规则:
def ldrelease(): if (len(lditime.get()) == 8 and len(ldilat.get()) == 8 and len(ldilong.get()) == 8 and ((ldd1cbv.get() == 1 or ldd2cbv.get() == 1) or ldd3cbv.get() == 1 or ldd4cbv.get() == 1 or ldd5cbv.get() == 1 or ldd6cbv.get() == 1)): # 临时关闭验证 lditime.config(validate="none") # 清空输入框 lditime.delete(0, tk.END) # 恢复原有验证配置 lditime.config(validate="key", validatecommand=(window.register(on_validate), "%P")) # 原有复选框操作保留 ldd1.deselect() ldd1.configure(state="normal") ldd2.deselect() ldd2.configure(state="normal") ldd3.deselect() ldd3.configure(state="normal") ldd4.deselect() ldd4.configure(state="normal") ldd5.deselect() ldd5.configure(state="normal") ldd6.deselect() ldd6.configure(state="normal")
方法2:修改验证函数允许空输入
直接在validate_time函数开头添加对空字符串的判断,允许输入框为空:
def validate_time(inputtime): if inputtime == "": # 允许空输入,解决清空问题 return True if len(inputtime) == 1 and inputtime[-1].isdigit(): return True if len(inputtime) == 2 and inputtime[-1].isdigit(): return True if len(inputtime) == 3 and inputtime[-1] == ":": return True if len(inputtime) == 4 and inputtime[-1].isdigit(): return True if len(inputtime) == 5 and inputtime[-1].isdigit(): return True if len(inputtime) == 6 and inputtime[-1] == ":": return True if len(inputtime) == 7 and inputtime[-1].isdigit(): return True if len(inputtime) == 8 and inputtime[-1].isdigit(): return True else: return False
方法3:调整验证触发时机
把验证模式从key改为focusout,这样只有当输入框失去焦点时才会触发验证,删除操作不会被验证拦截:
lditime = tk.Entry(validate="focusout", validatecommand=(window.register(on_validate), "%P"))
补充说明
你之前尝试delete(0,7)能删除到剩1个字符,是因为剩余的1个数字符合len(inputtime)==1且是数字的验证规则,所以操作被允许;但尝试清空到空字符串时,不符合任何验证通过的条件,所以被Tkinter拒绝执行。
内容的提问来源于stack exchange,提问作者jsmoth0990
相关产品推荐
相关产品推荐

