如何用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
相关产品推荐
相关产品推荐

