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()
我这辈子都找不到任何 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()