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
相关产品推荐
相关产品推荐

