Как добавить столбцы в TTK Treeview, используя al oop? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь использовать объект TTK Treeview для отображения различных данных, для которых требуются разные имена столбцов / столбцов, по какой-то причине при циклическом просмотре списка заголовков столбцов, которые я создал, я не могу получить больше, чем первый и последний заголовки независимо от того, из чисел, хотя будет работать 2.

Я попытался добавить секцию ожидания, так как это было для создания столбца, чтобы быстро перед заголовком, я попытался полностью удалить список и просто пытаюсь создать 4 заголовка в oop и все тот же результат.

Объект 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()

вот пример:

Example

Вопрос здесь добавление нескольких столбцов в древовидное представление демонстрирует проблема с получением правильного количества столбцов, но не дает явного ответа ниже о вызове столбцов до заголовков чтобы убедиться, что они отображаются.

1 Ответ

2 голосов
/ 24 января 2020

Вот пример, который я упомянул в комментариях. Это можно отформатировать лучше, но я просто добавляю в ваш код, чтобы показать, как это работает. Кроме того, была ошибка, из-за которой вы постоянно наращивали свой кортеж при каждом вызове функции.

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