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

