如何使用循环将列添加到 TTK Treeview?
How to add columns to a TTK Treeview using a loop?
我正在尝试使用 TTK Treeview object 来显示需要不同 columns/column 名称的不同数据,出于某种原因,当循环浏览我创建的列标题列表时,我永远无法获得超过第一个和最后一个标题,不管数字如何,尽管 2 也可以。
我试过添加一个睡眠部分,它是为了在标题之前快速创建列,我试过完全删除列表并尝试在循环中创建 4 个标题,但结果仍然相同。
treeview
object 将列存储在元组 tree2["columns"]
中,我在最后打印出来以验证所有标题引用都已存储,请参见下面的示例代码。
import tkinter as tk
from tkinter import ttk
headings = ["Heading0", "Heading1", "Heading2", "Heading3"]
root = tk.Tk()
root.title("Add headings")
frame1 = tk.Frame(root)
frame1.pack()
tree = ttk.Treeview(frame1)
tree["columns"] = ("C1", "C2")
tree.column("#0", width=500, minwidth=400, stretch=tk.NO)
tree.column("C1", width=200, minwidth=200, stretch=tk.NO)
tree.column("C2", width=200, minwidth=200, stretch=tk.NO)
tree.heading("#0", text="Name", anchor=tk.W)
tree.heading("C1", text="Type", anchor=tk.W)
tree.heading("C2", text="Index", anchor=tk.W)
print(tree["columns"])
t = {}
for i in range(5):
t[i] = tree.insert("", i, text="Example " + str(i), values=("val1", "val2"))
tree.pack(expand=True, fill="both")
def create():
for i, val in enumerate(headings):
if i == 0:
tree2.column("#0", width=200, minwidth=200, stretch=tk.NO)
tree2.heading("#0", text=val, anchor=tk.W)
elif i == 1:
tree2["columns"] = tree2["columns"] + ("C1")
tree2.column("C1", width=800, minwidth=200, stretch=tk.NO)
tree2.heading("C1", text=val[1], anchor=tk.W)
else:
tree2["columns"] = tree2["columns"] + ("C" + str(i),)
tree2.column("C" + str(i), width=800, minwidth=200, stretch=tk.NO)
tree2.heading("C" + str(i), text=val, anchor=tk.W)
print(val)
print(tree2["columns"])
btn1 = tk.Button(frame1, text="Add", command=create)
btn1.pack(side="top")
tree2 = ttk.Treeview(frame1)
tree2.pack(expand=True, fill="both")
root.mainloop()
这里有一个例子:
这里的问题 演示了获取正确列数的问题,但没有在下面给出明确的答案,即在标题之前调用列以确保显示它们。
这是我在评论中提到的例子。这可以格式化得更好,但我只是添加到您的代码中以展示它是如何工作的。此外,还有一个错误,您在每次函数调用时都在不断地构建元组。
import tkinter as tk
from tkinter import ttk
headings = ["Heading0", "Heading1", "Heading2", "Heading3"]
root = tk.Tk()
root.title("Add headings")
frame1 = tk.Frame(root)
frame1.pack()
tree = ttk.Treeview(frame1)
tree["columns"] = ("C1", "C2")
tree.column("#0", width=500, minwidth=400, stretch=tk.NO)
tree.column("C1", width=200, minwidth=200, stretch=tk.NO)
tree.column("C2", width=200, minwidth=200, stretch=tk.NO)
tree.heading("#0", text="Name", anchor=tk.W)
tree.heading("C1", text="Type", anchor=tk.W)
tree.heading("C2", text="Index", anchor=tk.W)
t = {}
for i in range(5):
t[i] = tree.insert("", i, text="Example " + str(i), values=("val1", "val2"))
tree.pack(expand=True, fill="both")
def create():
for i, val in enumerate(headings):
if i == 0:
tree2.column("#0", width=200, minwidth=200, stretch=tk.NO)
elif i == 1:
tree2["columns"] = ("C1", )
tree2.column("C1", width=800, minwidth=200, stretch=tk.NO)
else:
tree2["columns"] = tree2["columns"] + ("C" + str(i), )
tree2.column("C" + str(i), width=800, minwidth=200, stretch=tk.NO)
for i, val in enumerate(headings):
if i == 0:
tree2.heading("#0", text=val, anchor=tk.W)
elif i == 1:
tree2.heading("C1", text=val, anchor=tk.W)
else:
tree2.heading("C" + str(i), text=val, anchor=tk.W)
btn1 = tk.Button(frame1, text="Add", command=create)
btn1.pack(side="top")
tree2 = ttk.Treeview(frame1)
tree2.pack(expand=True, fill="both")
root.mainloop()
我正在尝试使用 TTK Treeview object 来显示需要不同 columns/column 名称的不同数据,出于某种原因,当循环浏览我创建的列标题列表时,我永远无法获得超过第一个和最后一个标题,不管数字如何,尽管 2 也可以。
我试过添加一个睡眠部分,它是为了在标题之前快速创建列,我试过完全删除列表并尝试在循环中创建 4 个标题,但结果仍然相同。
treeview
object 将列存储在元组 tree2["columns"]
中,我在最后打印出来以验证所有标题引用都已存储,请参见下面的示例代码。
import tkinter as tk
from tkinter import ttk
headings = ["Heading0", "Heading1", "Heading2", "Heading3"]
root = tk.Tk()
root.title("Add headings")
frame1 = tk.Frame(root)
frame1.pack()
tree = ttk.Treeview(frame1)
tree["columns"] = ("C1", "C2")
tree.column("#0", width=500, minwidth=400, stretch=tk.NO)
tree.column("C1", width=200, minwidth=200, stretch=tk.NO)
tree.column("C2", width=200, minwidth=200, stretch=tk.NO)
tree.heading("#0", text="Name", anchor=tk.W)
tree.heading("C1", text="Type", anchor=tk.W)
tree.heading("C2", text="Index", anchor=tk.W)
print(tree["columns"])
t = {}
for i in range(5):
t[i] = tree.insert("", i, text="Example " + str(i), values=("val1", "val2"))
tree.pack(expand=True, fill="both")
def create():
for i, val in enumerate(headings):
if i == 0:
tree2.column("#0", width=200, minwidth=200, stretch=tk.NO)
tree2.heading("#0", text=val, anchor=tk.W)
elif i == 1:
tree2["columns"] = tree2["columns"] + ("C1")
tree2.column("C1", width=800, minwidth=200, stretch=tk.NO)
tree2.heading("C1", text=val[1], anchor=tk.W)
else:
tree2["columns"] = tree2["columns"] + ("C" + str(i),)
tree2.column("C" + str(i), width=800, minwidth=200, stretch=tk.NO)
tree2.heading("C" + str(i), text=val, anchor=tk.W)
print(val)
print(tree2["columns"])
btn1 = tk.Button(frame1, text="Add", command=create)
btn1.pack(side="top")
tree2 = ttk.Treeview(frame1)
tree2.pack(expand=True, fill="both")
root.mainloop()
这里有一个例子:
这里的问题
这是我在评论中提到的例子。这可以格式化得更好,但我只是添加到您的代码中以展示它是如何工作的。此外,还有一个错误,您在每次函数调用时都在不断地构建元组。
import tkinter as tk
from tkinter import ttk
headings = ["Heading0", "Heading1", "Heading2", "Heading3"]
root = tk.Tk()
root.title("Add headings")
frame1 = tk.Frame(root)
frame1.pack()
tree = ttk.Treeview(frame1)
tree["columns"] = ("C1", "C2")
tree.column("#0", width=500, minwidth=400, stretch=tk.NO)
tree.column("C1", width=200, minwidth=200, stretch=tk.NO)
tree.column("C2", width=200, minwidth=200, stretch=tk.NO)
tree.heading("#0", text="Name", anchor=tk.W)
tree.heading("C1", text="Type", anchor=tk.W)
tree.heading("C2", text="Index", anchor=tk.W)
t = {}
for i in range(5):
t[i] = tree.insert("", i, text="Example " + str(i), values=("val1", "val2"))
tree.pack(expand=True, fill="both")
def create():
for i, val in enumerate(headings):
if i == 0:
tree2.column("#0", width=200, minwidth=200, stretch=tk.NO)
elif i == 1:
tree2["columns"] = ("C1", )
tree2.column("C1", width=800, minwidth=200, stretch=tk.NO)
else:
tree2["columns"] = tree2["columns"] + ("C" + str(i), )
tree2.column("C" + str(i), width=800, minwidth=200, stretch=tk.NO)
for i, val in enumerate(headings):
if i == 0:
tree2.heading("#0", text=val, anchor=tk.W)
elif i == 1:
tree2.heading("C1", text=val, anchor=tk.W)
else:
tree2.heading("C" + str(i), text=val, anchor=tk.W)
btn1 = tk.Button(frame1, text="Add", command=create)
btn1.pack(side="top")
tree2 = ttk.Treeview(frame1)
tree2.pack(expand=True, fill="both")
root.mainloop()