如何在 tkinter 中查看树视图的部分区域和水平滚动?

How to view partial area of a treeview and horizontal scrollable in tkinter?

我有一个由 tk.treeview 创建的 table,例如,有 10 列。目标是构建一个带有水平滚动条的treeview widget,widget的视图宽度设置为4列左右,使用水平滚动条查看其他列。

使用 tk.Frame 作为 parent 小部件和滚动条,垂直滚动会隐藏 header,所以不要使用它。

平台:WIN 10 Python:3.8.6 tkinter:8.6

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

# root.columnconfigure(0, weight=1)
# root.rowconfigure(0, weight=1)

columns = [f'Column {i}' for i in range(10)]

x_scrollbar = tk.Scrollbar(root, orient=tk.HORIZONTAL)
x_scrollbar.grid(row=1, column=0, sticky=tk.E+tk.W)
y_scrollbar = tk.Scrollbar(root, orient=tk.VERTICAL)
y_scrollbar.grid(row=0, column=1, sticky=tk.N+tk.S)

tree = ttk.Treeview(root, columns=columns, height=10, show="headings",
    xscrollcommand=x_scrollbar.set, yscrollcommand=y_scrollbar.set)
tree.grid(row=0, column=0, sticky=tk.N+tk.S+tk.E+tk.W)

for col in tree['columns']:
        tree.heading(col, text=f"{col}", anchor=tk.CENTER)
        tree.column(col, anchor=tk.CENTER, width=100)

for i in range(100):
    tree.insert('', 'end', values=[i*10+j for j in range(len(columns))])

x_scrollbar['command'] = tree.xview
y_scrollbar['command'] = tree.yview

root.mainloop()

问题是如何将视图宽度设置为大约 4 列并使用水平滚动条?像这样 ! (没有调整窗口大小)

有一个棘手的方法:

  • 最初将列宽设置为较小的尺寸,对于您的情况是 40(即 400 / 10)
  • 使用tree.update()
  • 强制更新树视图
  • 将列宽设置为所需的大小,即 100
for col in tree['columns']:
    tree.heading(col, text=f"{col}", anchor=tk.CENTER)
    tree.column(col, anchor=tk.CENTER, width=40) # initially smaller size
tree.update()
for col in tree['columns']:
    tree.column(col, width=100) # restore to desired size