五月春生 2023-11-15 14:43 采纳率: 66.7%
浏览 5
已结题

请教python的嵌套列表里有不固定的列信息,如何添加到pyqt5的tableWidget控件中,以表格形式展示。

拖入“根目录”这个文件夹,将里面所有文件尺寸累计并以目录名组织如下。


[['根目录', {'A2': 1, 'A3': 8, 'A1': 1, 'A4': 1, 'A0': 1}],
 ['目录1', {'A0': 2, 'A3': 1}],
 ['目录2', {'A3': 8, 'A1': 1, 'A4': 1}],
 ['目录3', {'A0': 3, 'A1': 3}]]

嵌套列表,内部每一项的第一值表示文件所在目录,第二值表示该目录下的文件尺寸字典之和。

如何让上面这个list,可以显示在pyqt5的tableWidget中,以表格形式显示。如下图。

img

上图中是别人用C#写的,在pyqt5的tableWidget中,目前只看到列数固定的写法。但我遇到的这是不固定列。如何整合到一张表格中去呢?

以下是拖入单个文件时的相关代码,可以显示单个文件的尺寸字典信息。

            name, suf = os.path.splitext(file)
            if suf != '.pdf':
                print(f"{name}不是pdf文件。")
                return
            # print(GetPdfsize(file))
            dict_result_sizenameandcount = GetSizeNameAndCount(GetPdfsize(file))
            dict_result_sizenameandcount['所在目录'] = GetDirnameOfFile(file)  # 将文件的所在目录名添加到尺寸结果的字典里。name:dirname

            print("当前拖拽的是文件:", dict_result_sizenameandcount)
            self.tableWidget.setRowCount(1)  # 设置表格行数
            self.tableWidget.setColumnCount(len(dict_result_sizenameandcount))  # 设置表格列数
            self.tableWidget.setHorizontalHeaderLabels(list(dict_result_sizenameandcount.keys()))  # 设置表格的标题名称
            i = 0
            for j in dict_result_sizenameandcount.keys():
                data = QTableWidgetItem(str(dict_result_sizenameandcount[j]))
                self.tableWidget.setItem(0, i, data)
                i += 1

img

是不是我这数据对于表格来说,不是完整的,根本就无法直接展示在表格中呢?也许要想办法将数据补齐,达到放入表格的行列要求。

  • 写回答

2条回答 默认 最新

  • 五月春生 2023-11-16 16:48
    关注

    已将列表中的字典进行空值补齐,形成固定列数。在表格展示之前,去除原列表中字典的key,只保留value。嵌套循环进行表格展示。

    img

    def form_size_table(list_result):
        '''
        根据合并相同上级目录后的列表:list_result,提取所有字典key,将每一项字典key补全,便以接下来在表格中展示。无值的key给空。
        :param list_result:
        :return:
        '''
        dict_temp = {}
        for k in list_result:
            dict_temp.update(k[1])
        print(f"合并后的字典,value有变化,只要key:{dict_temp}")
        list_keys = []
        for k in dict_temp.keys():
            list_keys.append(k)
        print(f"列表中的字典包含的所有key:{list_keys}")
    
        # 按照key的所有种类,将列表中的字典重新赋值,使每项字典长度一样。不存在的key,value给空
        print(list_result)
        for i in list_result:
            for j in list_keys:
                i[1].setdefault(j, "")
            i[1] = dict(sorted(i[1].items(), key=lambda item: item[0], reverse=True))   # 对字典中的key进行排序
        return list_result
    
    list_lastinfo = form_size_table(SameDirSizeTotal(list_temp))
    # 让处理完成的数据显示在QTableWidget表格控件中。
                rowcount = len(list_lastinfo)
                columncount = len(list_lastinfo[0][1]) + 1
                self.tableWidget.setRowCount(rowcount)  # 设置表格行数
                self.tableWidget.setColumnCount(columncount)  # 设置表格列数
                self.tableWidget.setHorizontalHeaderLabels(["所在目录"] + list(list_lastinfo[0][1].keys()))  # 设置表格的标题名称
                list_temp = []  # 去除了列表中字典的key后,形成的临时新列表,用于展示表格,便于双循环操作之用。
                for i in list_lastinfo:
                    list_temp.append([i[0]] + list(i[1].values()))  # 将原列表中的字典拆开,去除了key,形成新的列表,便于展示表格。例list_temp:[['根目录', '', '', 1, 1, '', ''], ['目录1', 1, 8, '', 1, '', 2], ['目录4', 1, 8, '', 1, '', ''], ['目录2', '', '', '', '', 1, '']]
                print(f"list_temp:{list_temp}")
                for i in range(rowcount):  # 遍历行
                    for j in range(columncount):  # 遍历列
                        data = QTableWidgetItem(str(list_temp[i][j]))  # 转换后可插入表格
                        self.tableWidget.setItem(i, j, data)
    
                self.tableWidget.resizeColumnsToContents()  # 使列宽跟随内容改变
                self.tableWidget.resizeRowsToContents()  # 使行高跟随内容改变
                self.tableWidget.setAlternatingRowColors(True)  # 使表格颜色交错显示
                self.tableWidget.horizontalHeader().setStretchLastSection(True)
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月24日
  • 已采纳回答 11月16日
  • 修改了问题 11月15日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题