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

PySimpleGUI循环中Radio按钮Key自动追加0致程序崩溃求助

问题原因

你遇到的问题是因为循环中多次创建了相同key的Radio元素,PySimpleGUI为保证全局元素key唯一性,会自动给重复key追加数字后缀(比如Name变成Name0),导致你通过values["Name"]访问时找不到对应键,引发程序崩溃。

同时你的代码存在逻辑错误:处理OK事件时关闭窗口后未立即退出while循环,会导致后续执行window.read()时访问已关闭窗口,进一步触发异常。

修复方案

方案1:确保每次循环的元素key唯一

在循环中给Radio的key添加循环标识(比如当前计数count),保证每个窗口的元素key不重复:

import PySimpleGUI as sg

# 初始化变量
count = 0
d1 = {}
col_list = ["列1", "列2", "列3"]  # 示例表头列表

sg.theme("reddit")  # 主题仅需设置一次,移至循环外

for item in col_list:
    # 给每个Radio的key添加count后缀,保证唯一性
    layout = [
        [sg.T("")],
        [sg.T("        "), sg.Button(item, size=(20, 4))],
        [sg.T("")],
        [sg.T("         "), sg.Radio('纬度:', "RADIO1", default=False, key=f"Lat_{count}")],
        [sg.T("         "), sg.Radio('经度', "RADIO1", default=False, key=f"Lon_{count}")],
        [sg.T("         "), sg.Radio('名称:', "RADIO1", default=False, key=f"Name_{count}")],
        [sg.T("         "), sg.Radio('描述:', "RADIO1", default=False, key=f"Desc_{count}")],
        [sg.Button('确定'), sg.Button('跳过'), sg.Button('退出')]
    ]

    window = sg.Window('选择列的显示方式', layout, size=(300, 300))

    while True:
        event, values = window.read()
        print("事件: ", event, " 值: ", values)

        if event == sg.WIN_CLOSED or event == "跳过":
            break
        elif event == "退出":
            print("正在停止应用程序!!!")
            window.close()
            quit()
        elif event == "确定":
            # 用对应的key判断选中状态
            if values[f"Name_{count}"]:
                d1[count] = item
            elif values[f"Lat_{count}"]:
                d1[count] = item
            elif values[f"Lon_{count}"]:
                d1[count] = item
            elif values[f"Desc_{count}"]:
                d1[count] = item
            print(d1)
            break  # 处理完确定事件后立即退出循环

    window.close()
    count += 1

方案2:彻底销毁窗口对象

如果不想修改key,可在每次循环结束后删除窗口对象,避免PySimpleGUI缓存旧元素的key:

import PySimpleGUI as sg

count = 0
d1 = {}
col_list = ["列1", "列2", "列3"]

sg.theme("reddit")

for item in col_list:
    layout = [
        [sg.T("")],
        [sg.T("        "), sg.Button(item, size=(20, 4))],
        [sg.T("")],
        [sg.T("         "), sg.Radio('纬度:', "RADIO1", default=False, key="Lat")],
        [sg.T("         "), sg.Radio('经度', "RADIO1", default=False, key="Lon")],
        [sg.T("         "), sg.Radio('名称:', "RADIO1", default=False, key="Name")],
        [sg.T("         "), sg.Radio('描述:', "RADIO1", default=False, key="Desc")],
        [sg.Button('确定'), sg.Button('跳过'), sg.Button('退出')]
    ]

    window = sg.Window('选择列的显示方式', layout, size=(300, 300))

    while True:
        event, values = window.read()
        print("事件: ", event, " 值: ", values)

        if event == sg.WIN_CLOSED or event == "跳过":
            break
        elif event == "退出":
            print("正在停止应用程序!!!")
            window.close()
            quit()
        elif event == "确定":
            if values["Name"]:
                d1[count] = item
            elif values["Lat"]:
                d1[count] = item
            elif values["Lon"]:
                d1[count] = item
            elif values["Desc"]:
                d1[count] = item
            print(d1)
            break

    window.close()
    del window  # 彻底销毁窗口对象,清除元素缓存
    count += 1
关键修复点
  • 将主题设置移到循环外,避免重复设置
  • 处理确定事件后立即break退出while循环,再关闭窗口
  • 要么保证每个窗口的元素key唯一,要么在窗口关闭后彻底销毁对象,避免PySimpleGUI自动修改key后缀

内容的提问来源于stack exchange,提问作者Lee Donovan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:48:20