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

