Записать значения из столбцов Pandas DataFrame в tkinter TreeView / Table Columns - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу записать значения из фрейма данных в древовидную структуру / таблицу 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.

Требуется вывод: enter image description here

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Первым аргументом 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-й строки всписок, и, поскольку мы передали значение индекса (второй аргумент), которое становится больше, вызов будет вставлять новую строку каждый цикл (из записи документов Python tkinter в Treeview -> insert: «если индекс больше чемили равное текущему количеству дочерних элементов, оно вставляется в конце ").

Наконец, я не уверен, что вы не опубликовали конец своего кода, но для того, чтобы дерево показываловверх, вам также нужно будет использовать пакет, сетку и т. д.

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/

0 голосов
/ 15 октября 2018

Пока я читал ваш код. Я заметил в конце строки, у вас есть дополнительная скобка @:

df[df_col[x]]]

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

Я бы предположил, что это объяснит KeyError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...