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

PySimpleGUI弹出框触发后如何引导用户返回主页面?

问题分析与修复方案

核心问题

你的应用在验证失败后自动关闭,根源是window.close()被写在了主循环内部——每次处理完一个事件(包括Submit验证失败的场景),代码都会执行关闭窗口的操作,直接终止了应用。

修复步骤

  1. 调整窗口关闭时机:把window.close()移到主while循环外部,只有当用户主动退出(点击Exit或关闭窗口)时才执行关闭。
  2. 修正数据库连接关闭逻辑:不要在Submit成功后立即关闭数据库连接conn,否则后续若有其他数据库操作会报错,应该在应用完全退出前统一关闭。
  3. 优化验证反馈:验证失败时只弹出错误提示,无需额外嵌套循环,主循环会自动等待用户修改输入后再次提交。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:27:01