Treeview 以一列为标题?

Treeview heading off by one column?

我这辈子都找不到任何 post 或文档来解释为什么 Treeview 标题与其余数据相差一列。

即使是我发现的 documentation 在示例中也显示了这个问题,但没有描述这个问题。

import tkinter as tk
import tkinter.ttk as ttk
import random

n, m = 40, 10
table = []
for i in range(n):
    line = []
    # line.append('') 
    # This adds a blank string to start of row data to off set the data.
    # It is my current work around but does not look great.
    for j in range(m):
        line.append(random.randint(0, 999))
    table.append(line)


class Demo(tk.Tk):
    def __init__(self):
        super().__init__()

        tree = ttk.Treeview(self)
        tree.pack()
        for i in range(n):
            tree.insert('', 'end', text=table[i][0], values=table[i][1:])

        tree['columns'] = list(range(m - 1))
        headings = list('ABCDEFGHI')
        for j in range(m - 1):
            tree.column(j, width=50, anchor='e')
            tree.heading(j, text=headings[j])


if __name__ == '__main__':
    Demo().mainloop()

如您所见,标题错了一栏。我无法弄清楚这是为什么或如何正确修复它。

我确实采用了一个糟糕的解决方法,即在行数据的开头附加一个空字符串,使其与正确的标题对齐,但这不是解决此问题的正确或最佳方法。

我是不是漏掉了什么?这对 Treeview 来说正常吗?

据我所知,第一列具有特殊含义 - 它可用于显示具有嵌套元素的树 - 就像 tkdoc 中的图像 - 它可能需要特殊方法来设置 header。

    tree.heading('#0', text='Hello')

结果:

您也可以使用"#1""#2"等设置其他header。

您可以在循环中使用 f'#{j}'

    headings = list('ABCDEFGHIJ')
    for j in range(m):
        tree.column(f'#{j}', width=50, anchor='e')
        tree.heading(f'#{j}', text=headings[j])


完整的工作代码:

import tkinter as tk
import tkinter.ttk as ttk
import random

n, m = 40, 10
table = []
for i in range(n):
    line = []
    # line.append('') 
    # This adds a blank string to start of row data to off set the data.
    # It is my current work around but does not look great.
    for j in range(m):
        line.append(random.randint(0, 999))
    table.append(line)


class Demo(tk.Tk):
    def __init__(self):
        super().__init__()

        tree = ttk.Treeview(self)
        tree.pack()
        for i in range(n):
            tree.insert('', 'end', text=table[i][0], values=table[i][1:])

        tree['columns'] = list(range(m - 1))
        headings = list('ABCDEFGHIJ')
        for j in range(m):
            tree.column(f'#{j}', width=50, anchor='e')
            tree.heading(f'#{j}', text=headings[j])

        #tree.heading('#0', text='Hello')

if __name__ == '__main__':
    Demo().mainloop()

文档:Column identifiers