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

如何在PySimpleGUI中实现表格按列排序功能

PySimpleGUI表格按列排序实现方案

完全可以实现该功能,核心思路是监听Table组件的表头点击事件,对原始数据排序后刷新表格展示即可,修改后的可运行代码如下:

#!/usr/bin/env python
import PySimpleGUI as sg
import csv

# Show CSV data in Table
sg.theme('Dark Red')

def table_example():
    filename = sg.popup_get_file('选择要打开的文件', no_window=True, file_types=(("CSV Files","*.csv"),))
    # --- populate table with file contents --- #
    if filename == '':
        return
    data = []
    header_list = []
    button = sg.popup_yes_no('该文件是否已经包含列名?')
    if filename is not None:
        with open(filename, "r", encoding='utf-8') as infile:
            reader = csv.reader(infile)
            if button == 'Yes':
                header_list = next(reader)
            try:
                data = list(reader)  # read everything else into a list of rows
                if button == 'No':
                    header_list = ['column' + str(x) for x in range(len(data[0]))]
            except:
                sg.popup_error('文件读取错误')
                return
    sg.set_options(element_padding=(0, 0))

    # 排序状态记录
    sort_column = 0
    sort_reverse = False

    layout = [[sg.Table(values=data,
                            headings=header_list,
                            max_col_width=25,
                            auto_size_columns=True,
                            justification='right',
                            num_rows=min(len(data), 20),
                            enable_events=True,  # 开启组件事件
                            key='-TABLE-')]]  # 绑定唯一key方便更新


    window = sg.Window('Table', layout, grab_anywhere=False)
    
    # 改为循环监听事件,支持多次点击表头
    while True:
        event, values = window.read()
        if event == sg.WIN_CLOSED:
            break
        # 监听表头点击事件
        if event.startswith('-TABLE-::HEADER'):
            # 获取点击的列索引
            col_idx = int(event.split(' ')[-1])
            # 如果两次点击同一列则切换排序方向
            if col_idx == sort_column:
                sort_reverse = not sort_reverse
            else:
                sort_column = col_idx
                sort_reverse = False
            # 排序逻辑:优先尝试转为数字排序,避免字符串排序导致10排在2前面的问题
            try:
                data.sort(key=lambda x: float(x[col_idx]), reverse=sort_reverse)
            except ValueError:
                # 转数字失败就按字符串排序
                data.sort(key=lambda x: x[col_idx], reverse=sort_reverse)
            # 更新表格内容
            window['-TABLE-'].update(values=data)

    window.close()

table_example()

关键修改说明

  • 给Table组件新增enable_events=True参数开启事件监听,新增key='-TABLE-'定位组件
  • 新增sort_column、sort_reverse两个变量记录当前排序状态,重复点击同一列会自动切换升/降序
  • 把单次窗口读取改为循环监听,点击表头触发排序逻辑后刷新表格数据即可
  • 排序逻辑兼容数字和字符串两种格式的列内容,更符合实际使用习惯
  • 额外补充了文件读取的utf-8编码配置,避免中文CSV读取乱码,同时把弹窗提示改为中文,更适配国内使用场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:42:03