这个例子改变了你的一点。 我认为,如果Treeview随其容器扩展,对用户来说是一个好处。
但是这种改变并不能解决问题。
我发现缩小列的宽度仍然使Treeview小部件具有原始宽度,因此也留有空白。 然后,如果我使用右边框调整窗口大小,并且在正确的方向上经过最后一列右边框,它将捕获标题,并且标题和窗口将再次一起调整大小...
我下面要做的是在更改宽度后,将容器(根窗口)的宽度设置为所有列的计算宽度。 我还考虑了列分隔符像素(否则,窗口宽度调整大小将不得不如上所述再次捕获):
您仍然可以手动从窗口边框中分离最后一个标头,打开空白,但是您也可以强制设置最小宽度。 重写标头即可解决此问题。 我认为您也可以捕获该事件并强制窗口宽度跟随,如果那很重要的话。
我不知道有一种更简单的方法可以解决此问题,而且我也不知道它是预期的还是更像是错误。 如果我有预定的列数,而我在“标题”而不是“树标题”上,为什么要留白空格?
import tkinter as tk
from tkinter import ttk
def change_headers():
global headers
headers = (headers[0]+'A', headers[1]+'B', headers[2]+'C')
widths = (50, 50, 50)
tree['columns'] = headers
for i, header in enumerate(headers):
tree.heading(header, text=header)
tree.column(header, width=widths[i])
w = sum(width for width in widths) + len(widths)-1
h = root.winfo_reqheight()
root.wm_geometry('{}x{}'.format(w,h))
root.update()
root = tk.Tk()
tree = ttk.Treeview(root)
button = ttk.Button(root, text='Change Headers', command=change_headers)
tree.grid(row=0, column=0, sticky=tk.NSEW)
button.grid(row=1, column=0, sticky=tk.EW)
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
headers = ('A', 'B', 'C')
widths = (150, 150, 150)
tree['show'] = 'headings'
tree['columns'] = headers
for i, header in enumerate(headers):
tree.heading(header, text=header)
tree.column(header, width=widths[i])
root.mainloop()