【问题标题】:How to add columns to a TTK Treeview using a loop?如何使用循环将列添加到 TTK 树视图?
【发布时间】:2020-01-24 13:57:04
【问题描述】:

我正在尝试使用 TTK Treeview 对象来显示需要不同列/列名称的不同数据,由于某种原因,在循环浏览我创建的列标题列表时,我永远无法获得超过第一个和最后一个标题的信息虽然 2 可以工作。

我尝试添加一个睡眠部分,以便在标题之前快速创建列,我尝试完全删除列表并尝试在循环中创建 4 个标题,但结果仍然相同。

treeview 对象将列存储在元组 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()

这是一个例子:

adding multiple columns to a treeview 此处的问题演示了获取正确列数的问题,但未在下面给出明确的答案,即在标题之前调用列以确保显示它们。

【问题讨论】:

  • 先创建所有列tree2["columns"] = tuple(f"C{i}" for i in range(1, len(headings)))
  • 要添加到此,您还应该首先配置您的列。我将发布一个工作示例。
  • 这能回答你的问题吗? Tkinter - Adding multiple columns to a Treeview
  • @stovfl 我不确定这个问题是否直接明确回答了这个问题,但是它确实意外地证明了下面答案的原则,但我不知道我会从那个问题中弄清楚这一点。
  • 随意,不同意它确实是重复的,阅读Why are some questions marked as duplicate?

标签: python python-3.x tkinter treeview ttk


【解决方案1】:

这是我在 cmets 中提到的示例。这可以更好地格式化,但我只是添加到您的代码中以显示它是如何工作的。此外,还有一个错误,您在每次函数调用时都在不断地构建您的元组。

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

【讨论】:

  • 谢谢 Axe319 和 @furas 你的建议都有效,我现在明白你必须先设置列,我的格式是在最后一个小时内重新安排了六次的程序,我很抱歉虽然我们首先知道为什么会发生这种情况吗?
猜你喜欢
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
相关资源
最近更新 更多