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

PySimpleGUI日期验证出错后输入框无法手动编辑问题求助

PySimpleGUI日期输入验证后无法手动编辑输入框的解决方法

问题根源

你的代码里while循环末尾的break语句是核心问题:无论点击OK后验证成功还是失败,循环都会执行到这个break,直接退出事件循环,窗口失去交互能力,输入框自然无法编辑。continue语句根本没机会让循环回到等待事件的状态。

修复方案

把break仅放在退出窗口的分支里,确保只有用户主动退出时才终止循环,验证失败后能回到事件循环,保持窗口可交互。同时可以增加输入框自动聚焦,方便用户快速修正错误。

完整修复代码

import PySimpleGUI as sg
import datetime as dt
from datetime import date, datetime

# Input and Calendar are have matching key/target (-Start-)

layout = [[sg.T('Choosing start date')], 
         [sg.T(text='Start:', s=(6,1)),sg.I(key='-Start-', size=(9,1),change_submits=False), 
             sg.CalendarButton("Calendar", close_when_date_chosen=True, target='-Start-', 
             no_titlebar=False, default_date_m_d_y=(1,1,None),format='%Y-%m-%d')],
         [sg.Ok(), sg.Exit()]]

def str2date(a):
    '''If date string is valid, return date object. Else, return False'''
    try:
        return dt.datetime.strptime(a, '%Y-%m-%d').date()
    except ValueError:
        sg.popup_no_titlebar('Not a valid date','try again', button_color='Red', font=font)
        return False

font = 'Helvetica 14'
window = sg.Window('Getting date input', layout, font=font)

while True:
    event, values = window.read()
    print(event, values)
    if event in (sg.WIN_CLOSED, 'Exit'):
        sg.popup(f'Existing ...{chr(10)}Until next time', no_titlebar=True, font=font)
        break  # 仅在退出时终止循环
    elif event == 'Ok':
        if str2date(values['-Start-']):
            sg.popup_no_titlebar(values['-Start-'], font=font)
        else:
            # 错误后自动聚焦输入框,方便修改
            window['-Start-'].set_focus()
            continue

window.close()

关键改动说明

  1. 调整break位置:将break移至(sg.WIN_CLOSED, 'Exit')事件分支内,确保只有用户主动退出窗口时才终止事件循环,验证失败后循环会继续等待下一次操作事件。
  2. 添加输入框聚焦:验证失败后调用window['-Start-'].set_focus(),自动将光标定位到输入框,提升用户修正错误的效率。

内容的提问来源于stack exchange,提问作者Pieter de Wit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:25:23