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

如何在Tkinter Treeview点击列排序后修改选中列颜色,实现类似Excel效果

Tkinter Treeview 排序列高亮实现方案

要实现点击列标题排序后高亮当前排序列的效果,核心思路是利用Treeview的tag机制设置样式,效果如下:
效果示例图

实现说明

原生ttk.Treeview默认仅支持行级别的tag样式配置,如果接受整行高亮效果可以直接使用下方代码;如果需要实现单列单元格高亮,需要引入tkintertable等第三方扩展库,或者重写Treeview的单元格渲染逻辑实现自定义绘制。

完整可运行代码

from tkinter import Tk, END
from tkinter import ttk

def treeview_sort_column(tv, col, reverse):
    # 原有排序逻辑
    l = [(tv.set(k, col), k) for k in tv.get_children('')]
    l.sort(key=lambda t: t[0], reverse=reverse)
    for index, (val, k) in enumerate(l):
        tv.move(k, '', index)
    
    # 清除所有行的原有高亮tag
    for item in tv.get_children():
        tv.item(item, tags=())
    # 给当前排序对应的所有行添加高亮tag
    for item in tv.get_children():
        tv.item(item, tags=('sort_highlight',))
    
    # 绑定下一次排序触发事件
    tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))

root = Tk()
columns = ('name', 'number',)
treeview = ttk.Treeview(root, columns=columns, show='headings')
# 配置高亮样式,背景色可自行调整,此处为Excel同款浅蓝
treeview.tag_configure('sort_highlight', background='#e8f0fe')

for t in (('one', '1'), ('ten', '10'), ('eleven', '11'), ('two', '2'), ('three', '3')):
    treeview.insert('', END, values=(t[0],t[1]))
treeview.pack()
for col in columns:
    treeview.heading(col, text=col, command=lambda c=col: treeview_sort_column(treeview, c, False))

root.mainloop()

可选优化:列标题同步高亮

如果需要同时高亮当前排序的列标题,可通过ttk.Style自定义标题样式,Windows平台可直接使用以下配置:

style = ttk.Style()
# 先设置标题默认样式
style.configure('Treeview.Heading', background='#ffffff')
# 排序触发时可修改对应列的heading参数实现高亮切换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 03:18:02