如何让ttk树形视图不显示多余的空列?

问题描述 投票:0回答:1

我正在使用 tkinter 构建一个应用程序,但遇到了一些烦人的问题。

当我将数据加载到 ttk 树视图中时,我发现树视图的右侧总是有一些空的附加列。我意识到对于更大的数据集,有更多的空列(实际数据已正确加载)。我想摆脱这些额外的列或知道其来源。我在下面附加了一个代码示例来显示该问题。

我还想创建一个列选择功能,但除非上述问题得到解决,否则我不想继续前进。有没有一个简单的解决方案来摆脱空列?是否可以开箱即用地选择列?我们的想法是拥有一点 excel 类型的功能,但不要太复杂。

import pandas as pd
import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showinfo

root = tk.Tk()
root.title('Treeview demo')
root.geometry('620x200')

data = {'Name':['Tom', 'nick', 'krish', 'jack', 'mack', 'tack', 'crack', 'lack'], 
        'Age':[20, 21, 19, 18, 20, 21, 19, 18]}

df = pd.DataFrame(data)

tree = ttk.Treeview(root, columns=df.columns, show='headings')
scrollbar_y = ttk.Scrollbar(root, command=tree.yview)
scrollbar_x = ttk.Scrollbar(root, command=tree.xview,
                                    orient=tk.HORIZONTAL)
tree.config(xscrollcommand=scrollbar_x.set, yscrollcommand=scrollbar_y.set)
scrollbar_y.pack(fill=tk.Y, side=tk.RIGHT)
scrollbar_x.pack(fill=tk.X, side=tk.BOTTOM)
tree.pack(fill="both", expand=True)

df.dropna(axis=1, how='all', inplace=True)

df.columns = [str(x)[:50] for x in df.columns]
df = df.reset_index(drop=True)

print("all cols : ", df.columns)

print(df.columns)

# display the data in the treeview.
df_list = list(df.columns)
df_reset = df.to_numpy().tolist()

print("No of columns ", len(df_list))

tree["columns"] = df.columns

for i in range(len(df_list)):
    col = df_list[i]
    tree.column(i, anchor='c')
    tree.heading(i, text=col)

j = 0
for dt in df_reset:
    v = [r for r in dt]
    print("v ", v)
    tree.insert('', 'end', iid=j, values=v)
    j += 1
print("Total rows : ", j)

root.mainloop()

enter image description here

提前感谢您的建议!

编辑:按照建议修复了树视图实例化到 df.columns 中的拼写错误。在真实的代码中,我实例化一个空树,然后用内容填充它并使用

设置列
tree["columns"] = df.columns.
python pandas tkinter treeview ttk
1个回答
0
投票

您需要使用实际的列名称

df.columns
而不是数字索引来配置树视图。这可以确保 DataFrame 列和 Treeview 之间正确对齐,从而防止出现额外的空列。

import pandas as pd
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title('Treeview demo')
root.geometry('620x200')

data = {'Name': ['Tom', 'Nick', 'Krish', 'Jack', 'Mack', 'Tack', 'Crack', 'Lack'], 
        'Age': [20, 21, 19, 18, 20, 21, 19, 18],
        'City': ['NY', 'LA', 'SF', 'CHI', 'HOU', 'DAL', 'SEA', 'ATL']}
df = pd.DataFrame(data)

tree = ttk.Treeview(root, show='headings')
scrollbar_y = ttk.Scrollbar(root, command=tree.yview)
scrollbar_x = ttk.Scrollbar(root, command=tree.xview, orient=tk.HORIZONTAL)
tree.config(xscrollcommand=scrollbar_x.set, yscrollcommand=scrollbar_y.set)

scrollbar_y.pack(fill=tk.Y, side=tk.RIGHT)
scrollbar_x.pack(fill=tk.X, side=tk.BOTTOM)
tree.pack(fill="both", expand=True)

columns = list(df.columns)
tree["columns"] = columns

for col in columns:
    tree.column(col, anchor='c')
    tree.heading(col, text=col)

for index, row in df.iterrows():
    tree.insert('', 'end', values=row.tolist())

def toggle_column(col):
    if tree.heading(col, option="text") == "":
        tree.heading(col, text=col)
        tree.column(col, width=100)
    else:
        tree.heading(col, text="")
        tree.column(col, width=0)

menu = tk.Menu(root)
root.config(menu=menu)
columns_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Columns", menu=columns_menu)

for col in columns:
    columns_menu.add_command(label=col, command=lambda c=col: toggle_column(c))

root.mainloop()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.