PySimpleGUI弹出框触发后如何引导用户返回主页面?
问题分析与修复方案
核心问题
你的应用在验证失败后自动关闭,根源是window.close()被写在了主循环内部——每次处理完一个事件(包括Submit验证失败的场景),代码都会执行关闭窗口的操作,直接终止了应用。
修复步骤
- 调整窗口关闭时机:把
window.close()移到主while循环外部,只有当用户主动退出(点击Exit或关闭窗口)时才执行关闭。 - 修正数据库连接关闭逻辑:不要在Submit成功后立即关闭数据库连接
conn,否则后续若有其他数据库操作会报错,应该在应用完全退出前统一关闭。 - 优化验证反馈:验证失败时只弹出错误提示,无需额外嵌套循环,主循环会自动等待用户修改输入后再次提交。
修改后的完整代码
while True: event, values = window.read() # values is a dictionary in Python if event == 'Exit': break elif event == 'Submit': validation_result = validate_inputs(values) # returns [is_valid[bool], invalid_values[array]] if validation_result[0]: # 输入验证通过 string_of_rpt_date = calculate_repeat_date(values) # 执行患者信息插入 c.execute("INSERT INTO PATIENT(SURNAME,FIRST_NAME,ADDRESS,DOB,MOBILE,PPS,DOCTOR,REPEAT_INTERVAL,REPEATS_LEFT,REPEAT_DATE) \ VALUES (?,?,?,?,?,?,?,?,?,?)",(values['-SURNAME-'],values['-FIRST_NAME-'],values['-ADDRESS-'],values['-DOB-'],values['-MOBILE-'],values['-PPS-'],values['-DOCTOR-'],values['-REPEAT_INTERVAL-'],values['-REPEATS_LEFT-'],string_of_rpt_date)) conn.commit() # 更新今日需提醒的患者剩余次数 c.execute("SELECT * FROM PATIENT WHERE REPEAT_DATE = ?", (string_of_today,)) results = c.fetchall() for row in results: mobile = row[4] first_name = row[1] repeats_left = row[8] repeats_left = repeats_left - 1 c.execute("UPDATE PATIENT SET REPEATS_LEFT =? WHERE FIRST_NAME = ?", (repeats_left, first_name,)) conn.commit() print(mobile, repeats_left, first_name, results) # flow_twilio(first_name,repeats_left) sg.popup(f"{values['-FIRST_NAME-']} {values['-SURNAME-']} was added to the database") else: error_message = generate_error_message(validation_result[1]) sg.popup(error_message) # 移除auto_close,让用户看完错误再手动关闭 if event == sg.WIN_CLOSED: break # 应用退出时统一释放资源 conn.close() window.close()
额外建议
- 可以给输入框添加实时验证(比如给
sg.Input设置enable_events=True),在用户输入过程中就提示错误,提升交互体验。 - 数据库操作建议包裹
try-except块,避免因数据库连接异常、SQL语法错误等导致应用直接崩溃。
内容的提问来源于stack exchange,提问作者Ian Kearns
相关产品推荐
相关产品推荐

