【问题标题】:Modifying treeview column width after creation创建后修改树视图列宽
【发布时间】:2018-09-26 06:22:35
【问题描述】:

我想为不同的报告使用相同的树小部件。为了完成这项工作,我需要在每次插入新数据之前修改标题。但是我无法让小部件按照我想要的方式运行:每当我更改标题/宽度时,都会突然出现一个空列。我可以做些什么来防止这种情况发生,或者我必须每次都销毁并重新创建一个新的树视图?

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

【问题讨论】:

    标签: python tkinter treeview


    【解决方案1】:

    这个例子稍微改变了你的。我认为这是一个 如果 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()
    

    【讨论】:

    • 谢谢,但由于其他布局,我不得不为我的 GUI 保持相同的大小。我仍在尝试找出是否有适当的方法来解决它
    • 如果大小固定并且列缩小,显然必须有一些剩余的空白。真正奇怪的是,新的树宽度变得比原来的总宽度大,而无需在第一个标题中更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多