DearPyGui表格组件全面指南
表格组件概述
DearPyGui的表格API是一个底层API,不仅可以用于数据展示,还能作为布局机制使用。表格由多个组件构成,包括列(columns)、行(rows)、单元格(cells)以及要显示的实际内容项。
基础表格创建
创建表格的基本步骤如下:
- 使用
dpg.table()创建表格容器 - 使用
dpg.add_table_column()添加列 - 使用
dpg.table_row()创建行并在其中添加内容
import dearpygui.dearpygui as dpg
dpg.create_context()
with dpg.window(label="示例窗口"):
with dpg.table(header_row=False):
# 添加3列
dpg.add_table_column()
dpg.add_table_column()
dpg.add_table_column()
# 添加4行数据
for i in range(4):
with dpg.table_row():
for j in range(3):
dpg.add_text(f"第{i}行 第{j}列")
dpg.create_viewport(title='表格示例', width=800, height=600)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
注意:表格最多支持64列。
单元格内容控制
单个单元格可以包含多个控件,通过dpg.table_cell()实现:
with dpg.table(header_row=False, resizable=True):
dpg.add_table_column(label="列1")
dpg.add_table_column(label="列2")
for i in range(3):
with dpg.table_row():
for j in range(2):
with dpg.table_cell():
dpg.add_button(label=f"按钮A {i},{j}")
dpg.add_button(label=f"按钮B {i},{j}")
表格样式定制
边框控制
通过以下参数控制表格边框显示:
borders_innerH: 内部水平边框borders_innerV: 内部垂直边框borders_outerH: 外部水平边框borders_outerV: 外部垂直边框
行背景色
使用row_background=True启用交替行背景色:
with dpg.table(header_row=True, row_background=True,
borders_innerH=True, borders_outerH=True):
# 列和行定义...
列标题设置
启用header_row=True并设置列标签即可显示列标题:
with dpg.table(header_row=True):
dpg.add_table_column(label="姓名")
dpg.add_table_column(label="年龄")
# 行数据...
列宽调整策略
表格支持多种列宽调整策略:
- 可调整大小:设置
resizable=True和borders_innerV=True - 调整策略:通过
policy参数设置mvTable_SizingFixedFit: 固定宽度适应内容mvTable_SizingFixedSame: 所有列固定相同宽度mvTable_SizingStretchProp: 按比例拉伸mvTable_SizingStretchSame: 等比例拉伸
混合策略示例
with dpg.table(policy=dpg.mvTable_SizingFixedFit):
dpg.add_table_column(label="固定列1", width_fixed=True)
dpg.add_table_column(label="固定列2", width_fixed=True)
dpg.add_table_column(label="弹性列", width_stretch=True)
高级列选项
表格列支持丰富的配置选项:
| 选项 | 默认值 | 说明 |
|---|---|---|
init_width_or_weight | 0.0 | 初始宽度(固定策略)或权重比例(拉伸策略) |
default_hide | False | 默认隐藏列 |
width_stretch | False | 列可拉伸 |
no_resize | False | 禁止手动调整大小 |
no_reorder | False | 禁止列重排序 |
no_sort | False | 禁止排序 |
表格排序实现
DearPyGui不直接处理数据排序,需要开发者实现回调:
def sort_callback(sender, sort_specs):
if not sort_specs: return
# 获取所有行
rows = dpg.get_item_children(sender, 1)
# 创建可排序列表(行ID, 排序值)
sortable = []
for row in rows:
cell = dpg.get_item_children(row, 1)[0]
sortable.append([row, dpg.get_value(cell)])
# 根据排序方向排序
reverse = sort_specs[0][1] < 0
sortable.sort(key=lambda x: x[1], reverse=reverse)
# 重新排序行
dpg.reorder_items(sender, 1, [x[0] for x in sortable])
with dpg.table(sortable=True, callback=sort_callback):
# 列和行定义...
选择功能实现
通过selectable控件实现行/单元格选择:
def select_callback(sender, app_data, user_data):
print(f"选择了: {user_data}")
with dpg.table() as table:
dpg.add_table_column(label="选择列")
for i in range(10):
with dpg.table_row():
# span_columns=True选择整行
dpg.add_selectable(label=f"行{i}", span_columns=True,
callback=select_callback, user_data=i)
性能优化技巧
对于大型表格,使用裁剪器(clipper)提升性能:
with dpg.table(clipper=True): # 启用裁剪
# 添加列
for i in range(5):
dpg.add_table_column()
# 添加大量行(只渲染可见部分)
for i in range(10000):
with dpg.table_row():
for j in range(5):
dpg.add_text(f"行{i} 列{j}")
最佳实践建议
- 对于静态表格,使用固定宽度策略(
mvTable_SizingFixedFit) - 需要自适应宽度时,使用拉伸策略(
mvTable_SizingStretchProp) - 超过100行的表格务必启用裁剪器
- 复杂表格考虑分页显示
- 频繁更新的表格使用
delay_search=True减少渲染开销
通过灵活运用这些功能,可以创建出功能丰富、性能优异的表格界面。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



