创建后修改Treeview列的宽度

时间:2018-09-26 06:22:36

标签: python tkinter treeview

我想对不同的报告使用相同的树小部件。为此,我需要在每次插入新数据之前修改标题。但是我无法让小部件按照我希望的方式运行:每当更改标题/宽度时,就会无处出现一个空列。有什么我可以防止的事情,还是我每次都必须销毁并重新创建一个新的树视图?

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
tree = ttk.Treeview(root, selectmode='browse')
tree.grid(row=0,column=0)
tree_header = ("One", "Two", "Three", "Four", "Five")
tree_width = (100, 100, 100, 100, 100)
tree["columns"] = tree_header
tree['show'] = 'headings'

for i in range(len(tree_header)):
    tree.column(tree_header[i],width=tree_width[i], anchor="w", stretch = False)
    tree.heading(tree_header[i], text=tree_header[i], anchor='w')
tree.insert("",tk.END,text="",value=(1,2,3,4,5))

def click_me():
    tree.delete(*tree.get_children())
    new_header = ("Six","Seven","Eight","Nine","Ten")
    new_width = (120, 80, 120, 80, 100)
    tree["columns"] = new_header
    tree['show'] = 'headings'
    for i in range(len(new_header)):
        tree.column(new_header[i],width=new_width[i],anchor="w", stretch = False)
        tree.heading(new_header[i],text=new_header[i],anchor="w")
    a_button.config(command=click_me_again)
    tree.insert("", tk.END, text="", value=(6, 7, 8, 9, 10))

def click_me_again():
    tree.delete(*tree.get_children())
    tree["columns"] = tree_header
    tree['show'] = 'headings'
    for i in range(len(tree_header)):
        tree.column(tree_header[i],width=tree_width[i],  anchor="w", stretch = False)
        tree.heading(tree_header[i], text=tree_header[i], anchor='w')
    a_button.config(command=click_me)
    tree.insert("", tk.END, text="", value=(1, 2, 3, 4, 5))

a_button = tk.Button(root,text="Click me",command=click_me)
a_button.grid(row=1,column=0)

root.mainloop()

1 个答案:

答案 0 :(得分:1)

这个例子会改变你的一点。我认为这是一个 如果Treeview随其扩展而对用户有利 容器。

但是这种改变并不能解决问题。

我发现缩小列宽 仍然将Treeview小部件与 原始宽度,因此是空白。 然后,如果我使用 右边的边界,它通过右边 最后一列右边界上方的方向 将捕获标题以及标题和窗口 将再次调整大小...

我下面要做的是设置容器(根窗口) width等于所有列的计算宽度, 更改宽度后。我也算 用于列分隔符像素 (否则,窗口宽度调整大小必须 如上所述再次捕获):

您仍然可以从 手动设置窗口边框,打开空白, 但是您也可以强制设置最小宽度。并重写 标头修复它。我想你也可以捕捉 该事件并强制窗口宽度跟随, 如果重要的话。

我不知道有解决此问题的更简单方法 行为,而且我也不知道是否可以预期 或更像是个错误。如果我有一个预定的号码 列,而我是在“标题”而不是“树标题”上,为什么 多余的空格?

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()