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

Tkinter Treeview标题高度刷新问题:初始化与动态修改差异及解决

Tkinter Treeview多行标题动态更新问题

先看问题复现代码:

import tkinter as tk
from tkinter import ttk
from tkinter.font import Font

root = tk.Tk()

font = ('Courier New', 10)
tkfont = Font(family=font[0], size=font[1])
width, height = tkfont.measure('W'), tkfont.metrics("linespace")

headings = ['A1', 'B1\nB2', 'C1\nC2\nC3']
data = [('A', [1,2,3]), ('B', [2,4,6]), ('C', [3,6,9])]

treeview = ttk.Treeview(root, columns=headings, displaycolumns=headings,
    show='tree headings', height=4)
for i, heading in enumerate(headings):
    treeview.heading(heading, text=heading)
    treeview.column(heading, width=width*4, minwidth=10, anchor=tk.CENTER)
for i, (text, value) in enumerate(data):
    treeview.insert('', i, text=text, value=value)
treeview.pack()

#treeview.heading('#0', text='\nHello World\n')

def callback():
    treeview.heading('#0', text='\nHello World\n')
    """ Add following statement(s) still not work
    treeview.update()
    treeview.update_idletasks()
    root.update()
    root.update_idletasks()
    """

button = tk.Button(root, text='Change', command=callback)
button.pack()

root.mainloop()

现象说明

  • 案例1:点击“Change”按钮调用treeview.heading('#0', text='\nHello World\n'),多行标题无法正常显示
  • 案例2:取消注释初始化时的treeview.heading('#0', text='\nHello World\n'),程序启动后能正常显示多行标题

1. 两个案例的差异原因

Treeview的标题行高度是在初始化渲染阶段根据标题文本的行数自动计算的。初始化时设置多行文本,Tkinter会在创建标题组件时就计算好足够的高度来容纳多行内容;但后期动态修改标题文本时,Tkinter只会更新文本内容,不会自动重新计算并调整标题行的高度,原有的单行高度会把多行文本截断,导致看起来像是修改没生效。

2. 案例1的解决方法

要强制Treeview重新计算标题行高度,只需在修改标题文本后,触发标题行的重新渲染。可以通过临时修改Treeview的show属性来实现:

修改callback函数如下:

def callback():
    treeview.heading('#0', text='\nHello World\n')
    # 临时隐藏再显示标题,触发重新渲染
    treeview.config(show='tree')
    treeview.config(show='tree headings')

原理是:修改show属性会让Treeview重新构建标题区域,此时会根据新的多行文本重新计算标题行的高度,从而正确显示多行内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:35:26