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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:45:03