我正在使用 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()
提前感谢您的建议!
编辑:按照建议修复了树视图实例化到 df.columns 中的拼写错误。在真实的代码中,我实例化一个空树,然后用内容填充它并使用
设置列tree["columns"] = df.columns.
您需要使用实际的列名称
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()