【问题标题】:Write values from Pandas DataFrame columns into tkinter TreeView/Table Columns将 Pandas DataFrame 列中的值写入 tkinter TreeView/Table Columns
【发布时间】:2026-01-06 21:00:01
【问题描述】:

我想将数据帧中的值写入 tkinter 树视图/表,但我无法执行此操作。 我的代码:

#Setting up tkinter window.
root = Tk()
tree = ttk.Treeview(root)

#taking file input through a dialog box from the user.
file = filedialog.askopenfile(parent=root,mode='rb',title='Choose a xlsx file')

#readinf the excel file selected by the user and then creating a dataframe of that file.
xls = pd.read_excel(file)
df = pd.DataFrame(xls)

#taking all the columns heading in a variable"df_col".
df_col = df.columns.values

#all the column name are generated dynamically.
tree["columns"]=(df_col)
counter = len(df)

#generating for loop to create columns and give heading to them through df_col var.
for x in range(len(df_col)):
    tree.column(x, width=100 )
    tree.heading(x, text=df_col[x])
#generating for loop to print values of dataframe in treeview column. 
    for i in range(counter):
        tree.insert('', 0, values=(df[df_col[x]]][i]))

它没有打印列并显示 KeyError:0。

需要输出:

【问题讨论】:

  • df[df_col]df 相同,df[0] 将是一个名为 0 的列,它不存在。
  • @Goyo df_col 是一个仅包含 df 列名的数组,而 df 包含具有列名和值的整个数据框
  • 我在代码中做了一些更新
  • @Goyo 此代码将所有结果打印在 tkinter 树视图的单个列中,而在我的 excel 文件中有 6 列,我坚持如何在所有 6 列中打印输出,顺便说一句,谢谢您的回复。

标签: python-3.x pandas dataframe tkinter treeview


【解决方案1】:

tree.column() 的第一个参数应该是你指定的列名:

tree["columns"]=(df_col)

问题是您使用字符串命名了列,但您尝试使用以下整数访问它们:

for x in range(len(df_col)):
    tree.column(x, width=100 )
    tree.heading(x, text=df_col[x])

在上面,您正在尝试访问 tree.columns(0),而不是 tree.columns('Company'),因此出现关键错误。

试试吧:

for x in range(len(df_col)):
    tree.column(df_col[x], width=100)
    tree.heading(df_col[x], text=df_col[x])

请注意,df_col 是 ndarray,而不是数据帧,这就是 df_col[x] 正常工作的原因(df[x] 会给出关键错误)。这是因为 df.columns.values 返回一个 ndarray。附带说明一下,将 ndarray 命名为 df_col 可能有点令人困惑。

您的插入也存在一些问题。第二个参数应该对应于您希望处理的条目的索引。一种解决方案是使用行索引作为第二个参数,后跟作为 text="rowLabel" 的行标签,然后是行的值列表:

tree.insert('', i, text=rowLabels[i], values=df.iloc[i,:].tolist())

应该将 rowLabels 定义为您想在表格的第一列中使用的任何内容。如果可能,我建议在此处使用电子表格中的索引列。可以这样定义:

rowLabels = df.iloc[:,indexColumn].tolist()

或:

rowLabels = df.index.tolist()

如果 df 在电子表格导入期间已命名由列定义的索引,则后者是可行的。在前者中,indexColumn 是一个 int,它引用 df 中包含唯一标识符的列号。

选项 values=df.iloc[i,:].tolist() 将第 i 行的所有列转换为列表,并且由于我们传递了一个变大的索引值(第二个参数),因此调用将在每个循环中插入一个新行(来自 Treeview 上的 python tkinter 文档条目 --> 插入:“如果索引大于或等于当前子节点数,则将其插入末尾”)。

最后,我不确定您是否没有发布代码的结尾,但是,为了让树显示出来,您还需要使用 pack、grid 等。

tree.pack()

tree.grid(row=0, column=0)

参考资料: https://docs.python.org/3/library/tkinter.ttk.html#tkinter.ttk.Treeview

这个有用的示例使一些步骤变得清晰: https://knowpapa.com/ttk-treeview/

【讨论】:

    【解决方案2】:

    当我阅读您的代码时。我注意到在最后一行你有一个额外的括号@:

    df[df_col[x]]]
    

    for i in range(counter):
        tree.insert('', 0, values=(df[df_col[x]]][i]))
    

    我认为这可以解释 KeyError。

    【讨论】:

      最近更新 更多