如何获取 Treeview 列以适合其所在的框架
How to get a Treeview columns to fit the Frame it is within
动态更改树视图数据时,我希望行扩展到树视图框架的大小。目前,如果我让 GUI 全屏显示并重新填充数据,它只使用可用屏幕大小的一小部分,即列不会调整大小或拉伸以填充屏幕宽度(我不太关心行填充)。我在下面制作了一个最小的工作示例:
import tkinter as tk
from tkinter import ttk
import random
class App():
def __init__(self):
self.root = tk.Tk()
self.frame = tk.Frame(self.root)
self.frame.pack(expand=True, fill=tk.BOTH)
self.tree = ttk.Treeview(self.frame, show="headings")
self.tree.pack(expand=True, fill=tk.BOTH)
self.button = ttk.Button(self.root, text="Fill", command=self.fill)
self.button.pack(side=tk.BOTTOM,expand=True,fill=tk.X)
self.root.mainloop()
def fill(self):
if self.has_data():
self.tree.delete(*self.tree.get_children())
i = random.randrange(1,10)
self.tree["columns"]=tuple([str(i) for i in range(i)])
for col in self.tree['columns']:
self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
self.tree.column(col, anchor=tk.CENTER)
j = random.randrange(10)
for j in range(j):
self.tree.insert("", "end", values = tuple([k for k in range(i)]))
def has_data(self):
has_tree = self.tree.get_children()
return True if has_tree else False
App()
请注意,我自己调整 GUI 的大小会自动调整列的大小。
问题是列是用初始大小创建的(我认为默认值为 200 像素),并且只有在创建后调整树视图的大小时才会拉伸。因此,您将不得不手动设置列宽以占据整个可用空间 space。为此,您可以使用树视图的 column()
方法的 width
参数:
self.tree.column(col, width=col_width)
其中 col_width
是总宽度除以列数。将此代码合并到 fill()
函数中可得到
def fill(self):
if self.has_data():
self.tree.delete(*self.tree.get_children())
i = random.randrange(1,10)
self.tree["columns"]=tuple([str(i) for i in range(i)])
col_width = self.tree.winfo_width() // i # compute the width of one column
for col in self.tree['columns']:
self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
self.tree.column(col, anchor=tk.CENTER, width=col_width) # set column width
j = random.randrange(10)
for j in range(j):
self.tree.insert("", "end", values = tuple([k for k in range(i)]))
动态更改树视图数据时,我希望行扩展到树视图框架的大小。目前,如果我让 GUI 全屏显示并重新填充数据,它只使用可用屏幕大小的一小部分,即列不会调整大小或拉伸以填充屏幕宽度(我不太关心行填充)。我在下面制作了一个最小的工作示例:
import tkinter as tk
from tkinter import ttk
import random
class App():
def __init__(self):
self.root = tk.Tk()
self.frame = tk.Frame(self.root)
self.frame.pack(expand=True, fill=tk.BOTH)
self.tree = ttk.Treeview(self.frame, show="headings")
self.tree.pack(expand=True, fill=tk.BOTH)
self.button = ttk.Button(self.root, text="Fill", command=self.fill)
self.button.pack(side=tk.BOTTOM,expand=True,fill=tk.X)
self.root.mainloop()
def fill(self):
if self.has_data():
self.tree.delete(*self.tree.get_children())
i = random.randrange(1,10)
self.tree["columns"]=tuple([str(i) for i in range(i)])
for col in self.tree['columns']:
self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
self.tree.column(col, anchor=tk.CENTER)
j = random.randrange(10)
for j in range(j):
self.tree.insert("", "end", values = tuple([k for k in range(i)]))
def has_data(self):
has_tree = self.tree.get_children()
return True if has_tree else False
App()
请注意,我自己调整 GUI 的大小会自动调整列的大小。
问题是列是用初始大小创建的(我认为默认值为 200 像素),并且只有在创建后调整树视图的大小时才会拉伸。因此,您将不得不手动设置列宽以占据整个可用空间 space。为此,您可以使用树视图的 column()
方法的 width
参数:
self.tree.column(col, width=col_width)
其中 col_width
是总宽度除以列数。将此代码合并到 fill()
函数中可得到
def fill(self):
if self.has_data():
self.tree.delete(*self.tree.get_children())
i = random.randrange(1,10)
self.tree["columns"]=tuple([str(i) for i in range(i)])
col_width = self.tree.winfo_width() // i # compute the width of one column
for col in self.tree['columns']:
self.tree.heading(col, text="Column {}".format(col), anchor=tk.CENTER)
self.tree.column(col, anchor=tk.CENTER, width=col_width) # set column width
j = random.randrange(10)
for j in range(j):
self.tree.insert("", "end", values = tuple([k for k in range(i)]))