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

