将 Python Tkinter-Treeview 中的行提取到 Pandas 数据框中



我有一个GUI,其中数据帧的结果根据先前输入的过滤器填充到python中的树视图中。然后,用户可以单击树视图并将值更新为所需的数字。视图中的行数可以在 1 - 20+ 之间变化。用户根据需要更新视图后,我在"检查分配"下方有一个按钮。

此时,我想将树视图"导出"到数据帧中,以便针对另一个表运行。我似乎不能简单地将其导出为数据帧。有什么解决方法吗?我只需要第一列和最后一列(共 8 列(来检查新更新的文件。

这是我到目前为止所拥有的。

def PrintAllocation(self):
treeview = tkk.Treeview(root)
treeview.grid(column = 1, row = 8, columnspan = 4, padx = 1, pady = 1)
cols = list(matches.columns)
treeview["columns"] = cols
for i in cols:
treeview.column(i, width = 100, anchor = "w")
treeview.heading(i,text=i,anchor='w',)
for index, row in matches.iterrows():
treeview.insert("",0,text=index,values=list(row))
def set_cell_value(event): # Double click to enter the edit state
for item in treeview.selection():
#item = I001
item_text = treeview.item(item, "values")
#print(item_text[0:2]) # Output the value of the selected row
column= treeview.identify_column(event.x)# column
print(column)
row = treeview.identify_row(event.y) #row
cn = int(str(column).replace('#',''))
rn = int(str(row).replace('I',''))
if column == '#8':
entryedit = Text(root,width=50,height = 1)
entryedit.grid(column = 2, row = 9, padx = 1, pady = 1)
else:
entryedit = Text(root,width=10,height = 1)
entryedit.grid(column = 2, row = 9, padx = 1, pady = 1)
def saveedit():
treeview.set(item, column=column, value=entryedit.get(0.0, "end"))
entryedit.destroy()
okb.destroy()
okb = ttk.Button(root, text='OK', width=4, command=saveedit)
okb.grid(column = 3, row = 9,padx = 1, pady=1)

def CheckAllocation():
children = treeview.getchildren()
for child in children:
print(treeview.set(child))
treeview.bind('<Double-1>', set_cell_value) # Double-click the left button to enter the edit
button_check = Button(root,text="Check Allocation", command = CheckAllocation)
button_check.grid(column = 2, row = 10, padx = 10, pady=10)
'''

我不太了解您的代码,但是当我需要获取熊猫的树视图时,我按以下步骤操作:

首先,我为树视图中的每一列创建一个空列表。

column_a_list = []
column_b_list = []
column_c_list = []
column_d_list = []

然后在"for"函数中运行树视图的行,我将每行中列的值附加到每个列列表中。

for child in self.treeview.get_children():
column_a_list.append(self.treeview.item(child)["values"][0])            
column_b_list.append(self.treeview.item(child)["values"][1])  
column_c_list.append(self.treeview.item(child)["values"][2])  
column_d_list.append(self.treeview.item(child)["values"][3])

然后,我从所有列表创建一个字典,使用标题作为键,列表是列表的值。

full_treeview_data_dict = {'HEADER A': column_a_list, 'HEADER B': column_b_list, 'HEADER C': column_c_list, 'HEADER D': column_d_list,}

然后,我从字典中创建一个数据帧。

treeview_df = pd.DataFrame.from_dict(full_treeview_data_dict)

下面是一个块中的完整示例代码:

column_a_list = []
column_b_list = []
column_c_list = []
column_d_list = []
for child in self.treeview.get_children():
column_a_list.append(self.treeview.item(child)["values"][0])            
column_b_list.append(self.treeview.item(child)["values"][1])  
column_c_list.append(self.treeview.item(child)["values"][2])  
column_d_list.append(self.treeview.item(child)["values"][3])  
full_treeview_data_dict = {'HEADER A': column_a_list, 'HEADER B': column_b_list, 'HEADER C': column_c_list, 'HEADER D': column_d_list,}
treeview_df = pd.DataFrame.from_dict(full_treeview_data_dict)

我希望它有所帮助。

你也可以这样做:

row_list = []
columns = ('name', 'school', 'c3', 'c4')
for row in treeview.get_children():
row_list.append(treeview.item(row)["values"])
treeview_df = pd.DataFrame(row_list, columns = columns)

目前的答案很好,我只是想在这里加上我的两分钱:

self.treeview_columns = [] # list of names here
# initialize empty df
# if too big you can preallocate but probably not needed
treeview_df = pd.DataFrame(None, columns=self.treeview_columns)
for row in self.treeview.get_children():
# each row will come as a list under name "values" 
values = pd.DataFrame([self.treeview.item(row)["values"]], 
columns=self.treeview_columns)
# print(values)
treeview_df = treeview_df.append(values)

这样,您可以使用 append 逐行增加 df,并减少需要执行的子集数量。

最新更新