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

PySimpleGUI子窗口无法关闭求助:添加问题功能窗口异常

PySimpleGUI子窗口无法关闭的解决方案

针对你遇到的添加问题子窗口无法关闭的问题,核心原因通常是未正确调用窗口关闭方法或事件循环处理不当,以下是具体解决方法:

1. 明确在提交后调用窗口关闭方法

在add_question函数的Enter按钮事件分支中,处理完数据库提交逻辑后,必须直接调用子窗口的close()方法,并退出事件循环。

修正后的代码示例:

def add_question():
    # 子窗口布局
    layout = [
        [sg.Text("输入问题内容:"), sg.Input(key='-QUEST_INPUT-')],
        [sg.Button("Enter"), sg.Button("Cancel")]
    ]
    # 创建子窗口
    sub_window = sg.Window("添加新问题", layout)
    
    while True:
        event, values = sub_window.read()
        # 处理窗口关闭或取消按钮
        if event == sg.WIN_CLOSED or event == "Cancel":
            break
        # 处理提交按钮
        if event == "Enter":
            # 执行Access数据库写入操作
            # 示例:write_to_db(values['-QUEST_INPUT-'])
            # 提交完成后立即关闭子窗口并退出函数
            sub_window.close()
            return
    # 处理其他关闭场景
    sub_window.close()

2. 避免事件循环阻塞

如果数据库写入操作耗时较长,会阻塞子窗口的事件循环,导致关闭指令无法及时响应。可以将数据库操作放到独立线程中执行,确保事件循环始终处于响应状态:

import threading

def save_to_db(question):
    # 这里写Access数据库写入逻辑
    pass

def add_question():
    layout = [
        [sg.Text("输入问题内容:"), sg.Input(key='-QUEST_INPUT-')],
        [sg.Button("Enter"), sg.Button("Cancel")]
    ]
    sub_window = sg.Window("添加新问题", layout)
    
    while True:
        event, values = sub_window.read()
        if event == sg.WIN_CLOSED or event == "Cancel":
            break
        if event == "Enter":
            # 启动线程执行数据库操作,不阻塞事件循环
            threading.Thread(target=save_to_db, args=(values['-QUEST_INPUT-'],), daemon=True).start()
            sub_window.close()
            return
    sub_window.close()

3. 确认窗口对象正确性

检查代码中是否误将主窗口对象当作子窗口调用close(),确保关闭的是当前打开的子窗口实例,而非主窗口。

内容的提问来源于stack exchange,提问作者Rauf İlyai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:16:36