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