使用PySimpleGUI创建设置弹窗时触发TypeError: object of type 'NoneType' has no len()错误求助
错误根源分析与解决思路
你遇到的TypeError: object of type 'NoneType' has no len()错误,核心问题是PySimpleGUI的Combo组件要求第一个参数必须是可迭代的选项列表/元组,但你传入了None。具体拆解两个关键原因:
键名拼写不匹配
你在初始化代码中读取的是settings["GUI"]["font_family"](当前使用的字体),但在settings_window里却错误使用了settings1["GUI"]["font"]——如果你的config.ini中没有GUI/font这个键,sg.UserSettings会返回None,直接传给Combo就会触发len(None)的错误。同理,font_size的处理也存在逻辑偏差:你从settings中取的是单个数值(比如12),但Combo需要的是可选字号的列表,直接传单个数值也会引发迭代错误。对
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
相关产品推荐
相关产品推荐

