Python 如何使用循环向TTK树视图添加列?

Python 如何使用循环向TTK树视图添加列?,python,python-3.x,tkinter,treeview,ttk,Python,Python 3.x,Tkinter,Treeview,Ttk,我试图使用TTK Treeview对象来显示需要不同列/列名的不同数据,由于某些原因,在我创建的列标题列表中循环时,无论数字如何,我都无法获得超过第一个和最后一个标题的数据,尽管2可以工作 我曾经尝试过添加一个sleep section encase,它是为了在标题之前快速创建列,我尝试过完全删除列表,只是尝试在循环中创建4个标题,结果仍然相同 treeview对象将列存储在tuplestree2[“columns”]中,我在末尾打印出来以验证是否存储了所有标题引用,请参见下面的示例代码 imp

我试图使用TTK Treeview对象来显示需要不同列/列名的不同数据,由于某些原因,在我创建的列标题列表中循环时,无论数字如何,我都无法获得超过第一个和最后一个标题的数据,尽管2可以工作

我曾经尝试过添加一个sleep section encase,它是为了在标题之前快速创建列,我尝试过完全删除列表,只是尝试在循环中创建4个标题,结果仍然相同

treeview
对象将列存储在tuples
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()
下面是一个例子:


这里的问题说明了获取正确列数的问题,但没有在标题之前给出下面调用列的明确答案,以确保它们被显示。

以下是我在评论中提到的示例。这可以更好地格式化,但我只是简单地添加到您的代码中,以展示它是如何工作的。此外,还有一个bug,每次函数调用都会不断地构建元组

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

下面是我在评论中提到的例子。这可以更好地格式化,但我只是简单地添加到您的代码中,以展示它是如何工作的。此外,还有一个bug,每次函数调用都会不断地构建元组

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

首先创建所有列
tree2[“columns”]=tuple(f“C{i}”表示范围内的i(1,len(标题))
要添加到这一点上,还应首先配置列。我将发布一个工作示例。这是否回答了您的问题@stovfl我不确定这个问题是否直接明确地回答了这个问题,但是它确实意外地演示了下面答案的原理,我不知道我是否能从这个问题中找到答案。请放心,不要同意它确实是重复的,先读创建所有列
tree2[“columns”]=tuple(f“C{i}”对于范围内的i(1,len(headings))
要添加到这一点上,还应首先配置列。我将发布一个工作示例。这是否回答了您的问题@stovfl我不确定这个问题是否直接明确回答了这个问题,但它确实意外地证明了下面答案的原则,我不知道我是否能从这个问题中找到答案。请放心,不要同意它确实是重复的,阅读感谢Axe319和@furas您的建议都有效,我现在明白您必须首先设置列,我的格式是一个在最后一个小时内重新安排了六打的程序。我很抱歉,尽管我们知道为什么会发生这种情况吗?谢谢Axe319和@furas。您的建议都很有效,我现在知道您必须首先设置列,我的格式是一个在最后一个小时内重新安排了六打的程序。我很抱歉,尽管我们知道为什么会发生这种情况吗?