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

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

我有一个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)

'''



python pandas tkinter treeview
1个回答
0
投票

我不太了解您的代码,但是当我需要对熊猫进行树状显示时,请按照以下步骤进行:

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

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)

希望对您有帮助。

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