You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:45:17