Treeview 偏离一列?

问题描述

我一生都找不到任何帖子或文档来解释为什么 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 来说是正常的吗?

enter image description here

解决方法

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

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

结果:

enter image description here

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

您可以在循环中使用 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])

enter image description here


完整的工作代码:

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}',anchor='e')
            tree.heading(f'#{j}',text=headings[j])

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

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

文档:Column identifiers