PySimpleGUI实现新窗口Listbox填充并暂停主程序等待用户选择
解决方法
你遇到的问题本质是PySimpleGUI的界面渲染、控件更新操作都依赖事件循环调度,你在主流程中调用un_hide、Update之后没有进入对应窗口的事件循环,主程序会继续向下执行,所有界面操作都会被积压到主流程空闲时才批量执行,所以会出现主程序跑完才渲染Listbox的情况。
实现方案
你只需要在更新完Listbox取值后,新增第二个窗口的独占事件循环,阻塞主流程直到用户完成选择即可,同时要注意第二个窗口的初始化代码必须放在你调用un_hide的位置之前,避免变量未定义报错。
完整示例代码
import PySimpleGUI as sg # 提前初始化第二个窗口,必须放在调用un_hide的代码之前 layout2 = [[sg.Text('The second window')], [sg.Listbox(values=["none"], select_mode='extended', key='listbox', size=(30, 6))], [sg.Button('save', button_color=('black', 'white'), visible=True ), ]] windows2 = sg.Window('Second Window', layout2, finalize=True) windows2.hide() keys_list = ["选项1", "选项2", "选项3"] # 替换为你实际的列表取值 # ----------- 主执行流程 ----------- # 其他主流程逻辑... # 展示第二个窗口并更新列表 windows2.un_hide() windows2['listbox'].update(values=keys_list) # 启动第二个窗口的事件循环,阻塞主流程直到用户操作完成 selected_options = [] while True: event, values = windows2.read() # 窗口关闭或者点击保存都退出循环 if event in (sg.WIN_CLOSED, 'save'): if event == 'save': selected_options = values['listbox'] # 拿到用户选择的内容 break # 隐藏第二个窗口,主流程继续执行 windows2.hide() # 后续可以用拿到的selected_options继续处理主逻辑 print(f"用户选择的内容:{selected_options}") # 其他主流程逻辑... # ----------- 主执行流程结束 ----------- # 程序退出前销毁窗口 windows2.close()
补充说明
windows2.read()会阻塞当前线程,执行前会先完成所有待处理的界面渲染操作,保证Listbox先完成值填充再等待用户选择,完全符合预期执行流程。- 如果需要多次复用选择窗口,不需要重复创建窗口实例,重复执行「显示窗口→更新列表→事件循环拿结果→隐藏窗口」的流程即可,性能更优。
内容的提问来源于stack exchange,提问作者diegooli
相关产品推荐
相关产品推荐

