Python Tkinter Treeview点击列标题实现DataFrame数据排序的方法
实现点击表头排序的修改方案
直接在你现有代码基础上新增排序逻辑、绑定表头点击事件即可,修改后完整代码如下:
import tkinter as tk from tkinter import ttk import pandas as pd import numpy as np def view_dfs(df1): df1 = df1.replace(np.nan, '', regex=True) table = tk.Tk() table.geometry("1220x500") table.pack_propagate(False) table.resizable(0, 0) frame = tk.LabelFrame(table, text="Report") frame.place(height=485, width=1200) # Treeview Widget tv1 = ttk.Treeview(frame, style="mystyle.Treeview") tv1.place(relheight=1, relwidth=1) # 初始化排序状态属性 tv1.sort_column = None tv1.sort_reverse = False treescrolly = ttk.Scrollbar(frame, orient="vertical", command=tv1.yview) treescrollx = ttk.Scrollbar(frame, orient="horizontal", command=tv1.xview) tv1.configure(xscrollcommand=treescrollx.set, yscrollcommand=treescrolly.set) treescrollx.pack(side="bottom", fill="x") treescrolly.pack(side="right", fill="y") # 新增排序函数 def sort_column(col): reverse = False # 如果当前点击列和上次排序列一致,切换排序方向 if tv1.sort_column == col: reverse = not tv1.sort_reverse # 收集所有行的当前列值和对应组件ID row_data = [] for item_id in tv1.get_children(''): cell_val = tv1.set(item_id, col) # 尝试转换为数值类型,避免字符串排序逻辑错误(如"10"排在"2"前) try: if '.' in cell_val: cell_val = float(cell_val) else: cell_val = int(cell_val) except (ValueError, TypeError): # 转换失败保留原字符串值 pass row_data.append((cell_val, item_id)) # 按照列值排序 row_data.sort(reverse=reverse) # 重新调整Treeview中行的顺序 for idx, (val, item_id) in enumerate(row_data): tv1.move(item_id, '', idx) # 更新排序状态 tv1.sort_column = col tv1.sort_reverse = reverse def Load_excel_df1(): tv1.delete(*tv1.get_children()) tv1["column"] = list(df1.columns) tv1["show"] = "headings" for column in tv1["columns"]: tv1.column(column, width = 100) # 给表头绑定点击事件,调用排序函数 tv1.heading(column, text=column, command=lambda _col=column: sort_column(_col)) df_rows = df1.to_numpy().tolist() for row in df_rows: tv1.insert("", "end", values=row) return def exit_window(): table.destroy() return Load_excel_df1() table.mainloop() return
核心修改说明
- 给Treeview组件新增了
sort_column、sort_reverse两个属性,用于记录上一次的排序状态,实现升序/降序切换 - 新增了
sort_column排序函数,自动适配数值和字符串类型的排序逻辑,避免字符串排序的常见错误 - 在创建表头时通过
command参数绑定了排序函数,lambda表达式用_col=column的写法规避了闭包变量复用的坑
内容的提问来源于stack exchange,提问作者Irshad
相关产品推荐
相关产品推荐

