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

