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

使用PySimpleGUI创建设置弹窗时触发TypeError: object of type 'NoneType' has no len()错误求助

错误根源分析与解决思路

你遇到的TypeError: object of type 'NoneType' has no len()错误,核心问题是PySimpleGUI的Combo组件要求第一个参数必须是可迭代的选项列表/元组,但你传入了None。具体拆解两个关键原因:

  1. 键名拼写不匹配
    你在初始化代码中读取的是settings["GUI"]["font_family"](当前使用的字体),但在settings_window里却错误使用了settings1["GUI"]["font"]——如果你的config.ini中没有GUI/font这个键,sg.UserSettings会返回None,直接传给Combo就会触发len(None)的错误。同理,font_size的处理也存在逻辑偏差:你从settings中取的是单个数值(比如12),但Combo需要的是可选字号的列表,直接传单个数值也会引发迭代错误。

  2. 对Combo组件的参数理解偏差
    Combo的第一个参数是下拉选项的集合(比如可选字体列表、可选字号列表),而不是当前保存的单个配置值。你现在错误地把“当前选中的配置值”当成了“选项列表”传入,完全不符合组件的设计逻辑。


具体解决步骤

1. 修正键名匹配与Combo参数逻辑

把固定的选项列表直接写在代码里,用settings中存储的当前值作为Combo的默认选中值,同时修正键名拼写问题:

def settings_window(settings1):
    # 定义固定的可选选项集合
    FONT_OPTIONS = ["Arial", "Calibri", "Times New Roman", "Verdana"]
    FONT_SIZE_OPTIONS = [10, 12, 14, 16, 18]
    THEME_OPTIONS = sg.theme_list()  # 直接获取PySimpleGUI所有内置主题
    
    settings_layout = [
        [sg.Text("Settings")],
        # 用固定选项列表作为Combo的选项,用settings中的当前值作为默认值
        [sg.Text("Font"), sg.Combo(FONT_OPTIONS, default_value=settings1["GUI"]["font_family"], key="-FONT-")],
        [sg.Text("Font Size"), sg.Combo(FONT_SIZE_OPTIONS, default_value=int(settings1["GUI"]["font_size"]), key="-FSIZE-")],
        [sg.Text("Theme"), sg.Combo(THEME_OPTIONS, default_value=settings1["GUI"]["theme"], key="-THEME-")],
        [sg.Button("Save Settings")]
    ]
    window = sg.Window("Settings Window", settings_layout, modal=True)
    while True:
        event, values = window.read()
        if event == sg.WINDOW_CLOSED:
            break
        if event == "Save Settings":
            # 将用户新选择的配置写回settings并持久化
            settings1["GUI"]["font_family"] = values["-FONT-"]
            settings1["GUI"]["font_size"] = str(values["-FSIZE-"])
            settings1["GUI"]["theme"] = values["-THEME-"]
            settings1.save()
            sg.popup("Settings saved successfully!")
            break
    window.close()

2. 初始化时设置默认配置(避免None值)

在程序启动时添加默认配置逻辑,确保即使config.ini不存在,也不会出现None值:

if __name__ == "__main__":
    SETTINGS_PATH = str(Path.cwd())
    settings = sg.UserSettings(
        path=SETTINGS_PATH,
        filename="config.ini",
        use_config_file=True,
        convert_bools_and_none=True
    )
    # 初始化默认配置(如果键不存在则自动创建)
    if "GUI" not in settings:
        settings["GUI"] = {}
    settings["GUI"].setdefault("theme", "DarkBlue3")
    settings["GUI"].setdefault("font_size", "12")
    settings["GUI"].setdefault("font_family", "Arial")
    
    theme = settings["GUI"]["theme"]
    font_size = int(settings["GUI"]["font_size"])
    font_family = settings["GUI"]["font_family"]
    sg.theme(theme)
    sg.set_options(font=(font_family, font_size))
    main_window()

额外注意事项

  • sg.UserSettings读取数值类型时可能返回字符串(比如font_size是字符串"12"),传给Combo的default_value时需要转成整数;
  • 点击"Save Settings"时必须调用settings1.save(),否则新配置不会写入config.ini文件。

内容的提问来源于stack exchange,提问作者Trevn Jones

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:17:33