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

PySimpleGUI中用Table替换Text解决数据对齐问题求助

解决PySimpleGUI中DataFrame数据对齐问题(改用Table组件)

问题说明

使用PySimpleGUI的sg.Text组件展示DataFrame查询结果时,表头与内容无法对齐,尝试改用sg.Table组件但未成功实现,原代码依赖大量独立的Text组件逐行展示原料数据。

解决方案:改用Table组件实现对齐

Table组件原生支持列对齐,只需将DataFrame数据转换为Table要求的格式(列表的列表),配合定义好的表头即可实现完美对齐。以下是改造后的完整示例:

步骤1:适配Table的数据格式与表头

先确定表头为['序号', 'RAW MATERIAL', 'REF NO.', '%W/W'],再将DataFrame中的数据提取为二维列表,同时保留原有产品名称和流程说明部分。

步骤2:改造布局与逻辑代码

import PySimpleGUI as sg
import pandas as pd

# 模拟你的DataFrame查询结果(实际替换为真实数据)
df = pd.DataFrame({
    'raw_name': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'],
    'ref_no': ['REF-A001', 'REF-B002', 'REF-C003', 'REF-D004', 'REF-E005', 'REF-F006',
               'REF-G007', 'REF-H008', 'REF-I009', 'REF-J010', 'REF-K011', 'REF-L012'],
    'percentage': ['10%', '15%', '5%', '20%', '8%', '12%', '7%', '18%', '9%', '11%', '6%', '13%']
})

# 转换为Table要求的二维列表格式
table_data = [[idx+1, row['raw_name'], row['ref_no'], row['percentage']] 
              for idx, row in df.iterrows()]

# 定义Table表头
headings = ['序号', 'RAW MATERIAL', 'REF NO.', '%W/W']

# 右侧布局改造(替换原有的多行Text组件)
right_col = [
    [sg.Text('PRODUCT: ', size=(200, 1), key='product', font='Courier 50')],
    [sg.Table(values=table_data,
              headings=headings,
              key='raw_materials_table',
              font='Courier 12',
              col_widths=[5, 50, 20, 10],  # 自定义列宽,适配内容长度
              auto_size_columns=False,
              justification='left',  # 列内容左对齐,保证和表头匹配
              num_rows=12)],  # 显示行数与原料数量一致
    [sg.Text('procedure'), sg.Text(size=(20, 10), key='procedure')]
]

# 完整布局(保留原左侧布局逻辑)
layout = [[sg.Column(left_col, element_justification='c'), sg.VSeperator(), sg.Column(right_col)]]

# 窗口运行逻辑
window = sg.Window('Product Data', layout)

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    # 示例:更新产品名称
    window['product'].update('Sample Product X')
    # 示例:动态刷新Table数据(后续有新数据时调用)
    # new_data = [...]  # 新的二维列表数据
    # window['raw_materials_table'].update(values=new_data)

window.close()

关键注意点

  • 数据格式:必须将DataFrame每行数据转为列表,组成二维列表传入Table的values参数
  • 列宽控制:通过col_widths手动指定列宽,搭配等宽字体(如Courier)确保对齐效果
  • 动态更新:后续需要刷新数据时,直接调用window['raw_materials_table'].update(values=新数据)即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:52:38