如何在PySimpleGUI中限制-DAY-和-MONTH-输入为2位数字?
限制PySimpleGUI日期输入框的输入长度与内容类型
你的问题在于size参数仅控制输入框的显示宽度,无法限制用户输入的内容长度和类型。要实现-DAY-和-MONTH-最多输入2位数字、-YEAR-最多4位数字的约束,可以通过输入事件监听+内容过滤的方式实现,具体步骤如下:
修改布局添加事件监听
给需要限制的输入框添加enable_events=True,这样每次输入内容变化时都会触发对应事件:
[sg.Text('DOB: dd/mm/yyyy '), sg.InputText(key='-DAY-', size=(2,1), enable_events=True), sg.Text('/'), sg.InputText(key='-MONTH-',size=(2,1), enable_events=True), sg.Text('/'), sg.InputText(key='-YEAR-',size=(4,1), enable_events=True)],
在事件循环中处理输入约束
在窗口的事件循环里,针对每个输入框的事件进行内容过滤,只保留数字并限制长度:
while True: event, values = window.read() if event == sg.WIN_CLOSED: break # 处理日期日输入框:仅保留2位数字 if event == '-DAY-': filtered_val = ''.join([c for c in values['-DAY-'] if c.isdigit()])[:2] if filtered_val != values['-DAY-']: window['-DAY-'].update(filtered_val) # 光标自动定位到输入框末尾,优化体验 window['-DAY-'].set_focus() window['-DAY-'].Widget.icursor(len(filtered_val)) # 处理日期月输入框:仅保留2位数字 elif event == '-MONTH-': filtered_val = ''.join([c for c in values['-MONTH-'] if c.isdigit()])[:2] if filtered_val != values['-MONTH-']: window['-MONTH-'].update(filtered_val) window['-MONTH-'].set_focus() window['-MONTH-'].Widget.icursor(len(filtered_val)) # 处理日期年输入框:仅保留4位数字 elif event == '-YEAR-': filtered_val = ''.join([c for c in values['-YEAR-'] if c.isdigit()])[:4] if filtered_val != values['-YEAR-']: window['-YEAR-'].update(filtered_val) window['-YEAR-'].set_focus() window['-YEAR-'].Widget.icursor(len(filtered_val))
代码说明
- 过滤非数字字符:通过列表推导式筛选输入中的数字,避免用户输入字母、符号等无效内容
- 限制长度:使用切片
[:2](日/月)和[:4](年)截断超出长度的内容 - 光标定位:更新输入框后自动将光标移到末尾,符合用户输入习惯
内容的提问来源于stack exchange,提问作者Ian Kearns
相关产品推荐
相关产品推荐

