PySimpleGUI输入值校验:空输入失焦恢复默认值实现问题
解决方案
问题根源
原有空值判断逻辑绑定在了输入内容变化事件上,用户删除操作只要触发内容为空就会立刻回填默认值,导致无法正常删除重输。我们只需要把空值补全的逻辑从内容变化事件转移到输入框失焦事件上即可,只有当用户结束对当前输入框的输入、切换到其他控件时,才检查是否为空并补全默认值,不会打断正常输入过程。
实现思路
- 给所有输入框开启失焦事件监听
- 输入内容变化时仅做实时合法性校验,不处理空值
- 输入框失焦时,检查内容是否为空,为空则回填
0.00,同时将合法值统一格式化为两位小数 - 抽离通用校验逻辑,避免两个输入框重复写代码
完整可运行代码
import PySimpleGUI as sg def validate_input(window, key, value): # 空值在失焦时处理,实时校验不处理 if not value: return try: # 支持.xx格式的输入,比如.5自动识别为0.5 in_as_float = float(value) # 限制最大值为5 if in_as_float > 5: window[key].update('5.00') return # 限制小数点后最多两位 if '.' in value: decimal_part = value.split('.')[1] if len(decimal_part) > 2: window[key].update(value[:-1]) return except: # 不需要支持负数可删除下方两行判断 if len(value) == 1 and value == '-': return # 非法输入删除最后一位 window[key].update(value[:-1]) # 布局新增lostfocus_event=True参数,开启失焦事件 layout = [ [sg.Input(key='first_input', enable_events=True, default_text='0.00', lostfocus_event=True)], [sg.Input(key='second_input', enable_events=True, default_text='0.00', lostfocus_event=True)], [sg.Button('Exit')] ] window = sg.Window('Main', layout) input_keys = ['first_input', 'second_input'] while True: event, values = window.read() if event in ['Exit', sg.WIN_CLOSED]: break # 处理输入框内容变化事件,实时校验 if event in input_keys: validate_input(window, event, values[event]) # 处理输入框失焦事件,补全空值、格式化 if event.endswith('-LOSTFOCUS'): current_key = event.replace('-LOSTFOCUS', '') current_val = values[current_key] if not current_val: # 空值恢复默认 window[current_key].update('0.00') else: # 合法值统一格式化为两位小数 try: formatted = f"{float(current_val):.2f}" window[current_key].update(formatted) except: window[current_key].update('0.00') window.close()
关键修改说明
- 给每个Input控件添加了
lostfocus_event=True参数,失焦时会触发{key}-LOSTFOCUS格式的专属事件,不会和内容变化事件混淆 - 空值补全逻辑仅在失焦时触发,用户删除输入内容准备重输时不会被打断,只有切换到其他控件时留空才会自动补
0.00 - 新增了两位小数的格式校验,保证最终输出一定是
.2f格式的浮点数 - 抽离了通用校验函数,两个输入框共用一套逻辑,不需要重复编码
- 修复了测试代码中的key拼写错误(
firs_input少了字母t)
内容的提问来源于stack exchange,提问作者marekp3
相关产品推荐
相关产品推荐

