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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:06