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()
关键改动说明
- 调整
break位置:将break移至(sg.WIN_CLOSED, 'Exit')事件分支内,确保只有用户主动退出窗口时才终止事件循环,验证失败后循环会继续等待下一次操作事件。 - 添加输入框聚焦:验证失败后调用
window['-Start-'].set_focus(),自动将光标定位到输入框,提升用户修正错误的效率。
内容的提问来源于stack exchange,提问作者Pieter de Wit
相关产品推荐
相关产品推荐

