PySimpleGUI GUI程序运行报错:TypeError: list indices must be integers or slices, not Button
问题概述
基于PySimpleGUI开发的项目中,使用config.ini作为配置文件(代码中用settings变量引用)实现设置窗口功能时,触发如下错误:
File "c:\Users\User\Desktop\Creating_YourOwn_Package\main.py", line 12, in settings_window [sg.Text("SETTINGS")],... TypeError: list indices must be integers or slices, not Button
用户提供的报错相关代码片段:
def settings_window(settings): layout = [[sg.Text("SETTINGS")], [sg.Text("Separator"), sg.Input(settings["CSV"]["separator"], s=1, key="-SEPARATOR-"), sg.Text("Decimal"), sg.Combo(settings["CSV"]["decimal"].split("|"), default_value = settings["CSV"]["decimal_default"], s=1, key="-DECIMAL-"), sg.Text("Sheet Name:"), sg.Input(settings["Excel"]["sheet_name"], s=20, key="-SHEET_NAME-")] [sg.Button("Save Current Settings", s=20)]] window = sg.Window(title="Settings", layout = layout, modal=True) while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == "Save Current Settings": settings["CSV"]["separator"] == values["-SEPARATOR"] settings["CSV"]["decimal"] == values["-DECIMAL-"] settings["Excel"]["sheet_name"] == values["-SHEET_NAME-"] sg.popup_no_titlebar("Settings saved!") break window.close() if __name__ == "__main__": SETTINGS_PATH = Path.cwd() settings = sg.UserSettings( path = SETTINGS_PATH, filename="config.ini", use_config_file=True, convert_bools_and_none=True ) theme = settings["GUI"]["theme"] font_family = settings["GUI"]["font_family"] font_size = int(settings["GUI"]["font_size"]) sg.theme(theme) sg.set_options(font=(font_family, font_size)) main_window()
报错原因
列表语法缺失逗号:构建layout时,包含Sheet Name输入框的列表(代码块中第三行的最后一个列表)与下一行的按钮列表之间没有添加逗号分隔。Python会将这种连续的列表语法解析为「用后一个列表作为前一个列表的索引」,而sg.Button对象无法作为列表索引,因此触发TypeError。
解决方法
在包含Sheet Name输入框的列表末尾添加逗号,明确分隔两个独立的行列表:
def settings_window(settings): layout = [[sg.Text("SETTINGS")], [sg.Text("Separator"), sg.Input(settings["CSV"]["separator"], s=1, key="-SEPARATOR-"), sg.Text("Decimal"), sg.Combo(settings["CSV"]["decimal"].split("|"), default_value = settings["CSV"]["decimal_default"], s=1, key="-DECIMAL-"), sg.Text("Sheet Name:"), sg.Input(settings["Excel"]["sheet_name"], s=20, key="-SHEET_NAME-")], # 此处添加逗号 [sg.Button("Save Current Settings", s=20)]] # 后续窗口创建与事件循环代码保持不变
额外需要修复的逻辑问题
除了上述语法错误,代码中还有两处影响功能的问题:
- 赋值运算符误用:保存设置时使用了
==(比较运算符)而非=(赋值运算符),导致配置不会被实际修改。修正如下:# 错误写法 # settings["CSV"]["separator"] == values["-SEPARATOR"] # 正确写法 settings["CSV"]["separator"] = values["-SEPARATOR-"] settings["CSV"]["decimal"] = values["-DECIMAL-"] settings["Excel"]["sheet_name"] = values["-SHEET_NAME-"] - Key拼写不一致:原代码中
values["-SEPARATOR"]缺少末尾的-,与Input组件定义的key="-SEPARATOR-"不匹配,会导致取值失败,需统一Key名称。
内容的提问来源于stack exchange,提问作者Nihat Sadiqzada
相关产品推荐
相关产品推荐

