0

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

甚至我发现的文档在示例中也显示了这个问题,但没有描述这个问题。

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 来说是正常的吗?

在此处输入图像描述

4

1 回答 1

1

据我所知,第一列有特殊含义——它可以用来显示带有嵌套元素的树——比如在tkdoc中的图像上——它可能需要特殊的方法来设置标题。

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

结果:

在此处输入图像描述

您也可以使用"#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])

在此处输入图像描述


完整的工作代码:

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

文档:列标识符

于 2021-05-01T04:46:52.860 回答