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

PySimpleGUI GUI程序运行报错:TypeError: list indices must be integers or slices, not Button

PySimpleGUI配置窗口报错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)]]
    # 后续窗口创建与事件循环代码保持不变

额外需要修复的逻辑问题

除了上述语法错误,代码中还有两处影响功能的问题:

  1. 赋值运算符误用:保存设置时使用了==(比较运算符)而非=(赋值运算符),导致配置不会被实际修改。修正如下:
    # 错误写法
    # settings["CSV"]["separator"] == values["-SEPARATOR"]
    # 正确写法
    settings["CSV"]["separator"] = values["-SEPARATOR-"]
    settings["CSV"]["decimal"] = values["-DECIMAL-"]
    settings["Excel"]["sheet_name"] = values["-SHEET_NAME-"]
    
  2. Key拼写不一致:原代码中values["-SEPARATOR"]缺少末尾的-,与Input组件定义的key="-SEPARATOR-"不匹配,会导致取值失败,需统一Key名称。

内容的提问来源于stack exchange,提问作者Nihat Sadiqzada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:43:08