Tkinter Entry组件delete方法含数字与点时失效问题求助
问题原因
当你给Entry组件设置validate='key'后,所有键盘操作(包括删除)都会触发验证函数。执行delete(0, tk.END)清空内容时,传入验证函数的%S是空字符串,而你的validar_ingresos只允许数字或点,空字符串不满足条件,导致验证失败,清空操作被tkinter阻止。
解决方法
方法一:临时禁用验证再清空
修改borrar_datos函数,在清空前关闭验证,完成后重新开启:
def borrar_datos(): # 临时关闭验证 self.caja_dbp.config(validate='none') self.caja_dbp.delete(0, tk.END) # 恢复原验证规则 self.caja_dbp.config( validate='key', validatecommand=(self.register(validar_ingresos), '%S') )
方法二:修改验证函数,兼容删除场景
直接让验证函数允许空字符串(对应删除操作的触发),还可以顺便优化输入合法性(比如限制仅一个小数点):
基础兼容版本
def validar_ingresos(text): # 允许空字符串(删除操作)、数字、单个点 return text == '' or text.isnumeric() or text == '.'
优化合法性版本(限制仅一个小数点)
把验证函数改成类方法,方便访问Entry当前内容,避免输入多个点:
class VentanaPrincipal(tk.Tk): # 改成类方法,方便获取输入框当前内容 def validar_ingresos(self, text): if text == '': return True # 允许删除操作 if text.isnumeric(): return True if text == '.': # 确保当前输入框里还没有小数点 return '.' not in self.caja_dbp.get() return False def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.title(f'prueba') self.config(width=200, height=200) # 注册类方法作为验证函数 self.caja_dbp = ttk.Entry( self, justify=tk.CENTER, width=5, validate='key', validatecommand=(self.register(self.validar_ingresos), '%S') ) self.caja_dbp.pack() def borrar_datos(): self.caja_dbp.delete(0, tk.END) self.boton_reestablecer = ttk.Button(self, text='RESET', command=borrar_datos) self.boton_reestablecer.pack()
内容的提问来源于stack exchange,提问作者Juan Francisco Prieto
相关产品推荐
相关产品推荐

