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

如何用PySimpleGUI实现支持自定义行色、可增删的列表组件?

不用必须使用Frame组件,有两种更简单的实现方案,完全可以贴近你想要的调用逻辑:

  • 方案1:使用sg.Table原生组件(适合纯文本列表场景)
    PySimpleGUI的Table组件原生支持逐行设置背景/文字颜色,不需要自定义控件,代码示例如下:
    布局定义:

    import PySimpleGUI as sg
    
    # 示例数据:(显示内容, 行颜色)
    my_data = [("条目1", "red"), ("条目2", "green"), ("条目3", "blue")]
    table_values = [[v] for v, c in my_data]
    row_colors = [(i, c) for i, (v, c) in enumerate(my_data)]
    
    layout = [
        [sg.T('Above the data stuff')],
        [sg.Table(
            values=table_values,
            headings=[''], # 不需要表头可以留空
            hide_headers=True, # 隐藏表头
            auto_size_columns=True,
            row_colors=row_colors,
            key='-DATA-',
            select_mode=sg.TABLE_SELECT_MODE_BROWSE
        )]
    ]
    

    动态更新列表的写法和你预期的逻辑几乎一致:

    # 新数据更新时调用
    new_data = [("新条目1", "purple"), ("新条目2", "orange")]
    window['-DATA-'].update(
        values=[[v] for v, c in new_data],
        row_colors=[(i, c) for i, (v, c) in enumerate(new_data)]
    )
    

    新增、删除行只需要修改你的数据源数组,再调用上述update方法即可,无需修改原始布局。

  • 方案2:使用sg.Column容器(适合每行需要放多个控件的场景)
    如果你需要每行不止显示文本,还要加删除按钮、输入框等控件,可以用可滚动的Column容器实现,也不需要用到Frame:
    布局定义:

    layout = [
        [sg.T('Above the data stuff')],
        [sg.Column(
            [],
            key='-LIST_CONTAINER-',
            scrollable=True,
            vertical_scroll_only=True,
            size=(300, 400) # 可根据需求调整容器尺寸
        )]
    ]
    

    动态更新逻辑完全符合你预期的写法:

    my_data = [("条目1", "red"), ("条目2", "green")]
    # 每行可以自定义加其他控件,比如删除按钮
    new_layout = [
        [sg.T(v, text_color=c), sg.B('删除', key=f'-DEL-{i}-')] 
        for i, (v,c) in enumerate(my_data)
    ]
    window['-LIST_CONTAINER-'].update(new_layout)
    

内容的提问来源于stack exchange,提问作者Charles Merriam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:04