python,pyqt5,QTableWidgetItem插入内容,报错item = QtWidgets.QTableWidgetItem(str(data[i][j])) KeyError: 0

目录

一、背景

二、解决办法

2.1、思路

2.1.1、输出data查看类型

 2.1.2、提取思路

2.1.3、表插入数据思路

2.2、提取与显示代码

2.3、结果

2.3.1、运行结果截图


一、背景

因课程设计需要使用pyqt5做个界面显示内容,故准备在表格上一行一行显示数据,如下图1:

图1

使用的插入表格数据的代码如下图2:

# 这里是代码节选,data的数据是数据库查到的数据

data = cur.fetchall()  # 获取到的数据以元组的形式赋值
data for i in range(len(data)):  # 遍历
         for j in range(len(data[i])):
              item = QtWidgets.QTableWidgetItem(str(data[i][j]))
              self.tableWidget.setItem(i, j, item)

图2

插入表格数据代码的代码运行后出现如下图3:

 图3

报错解析:

KeyError:值为空;

经过手动输出print(str(data[i][j]))以及查阅资料,发现此时的str(data[i][j])语句的确内容为空;

说明:

不知道啥原因,网上找的资料,都是使用str(data[i][j])可以正常获取到内容,我这里却不行。

二、解决办法

2.1、思路

插入表是先定位表格,然后在插入内容,那么只需要把内容正确提取出来即可,本文要显示的内容是数据库返回的数据:data,先输出data并分析是什么类型的数据,然后在进行数据的提取与保存,插入时在使用即可;

2.1.1、输出data查看类型

 2.1.2、提取思路

知道data是元组包含字典类型,先把每一个键值对提取出来,在把提取出来的键值对分别提取id与name的值即可;

2.1.3、表插入数据思路

如下图4:

 图4

可以知道,当j为0时,我们要插入表格的值是id的值,j为1时,插入表格的值是name的值;

2.2、提取与显示代码

# 前面是有内容的,但是要解决的报错是这部分的内容,以下是成功解决的代码逻辑

        data = cur.fetchall()  # 获取到的数据以元组的形式赋值给data
        print(data)    # 查看数据是什么类型
        list_data = []  # 存id和name值
        all_id = [0, 0, 0, 0]  # 接收id
        all_name = [0, 0, 0, 0]  # 接收name
        # 接收到的数据长度(返回的数据是键值对)是多少就执行多少次,提取多少次
        for x in range(0, len(data)): 
            all_id[x] = data[x].get('id')  # data[x]获取每一个键值对,获取后提取每一个键值对的id值
            all_name[x] = data[x].get('name')  # 同上逻辑
            list_data.append(all_id[x])    # 把数据添加到一个元组,分别操作数据
            time.sleep(0.3)                # 延时有没有无所谓
            list_data.append(all_name[x])
        print(list_data)   # 输出数据,查看是否符合
        num_id = 0
        num_name = 1
        for i in range(len(data)):  # 遍历
            # for j in range(len(data[i])):
            for j in range(2):
                # 设置id
                if j == 0:
                    one_item = QtWidgets.QTableWidgetItem(str(list_data[num_id]))
                    num_id += 2
                    self.tableWidget.setItem(i, j, one_item)
                # 设置name
                else:
                    two_item = QtWidgets.QTableWidgetItem(str(list_data[num_name]))
                    num_name += 2
                    self.tableWidget.setItem(i, j, two_item)

2.3、结果

2.3.1、运行结果截图

如下图5:

图5

不可否认,这不一定是一个好方法,当数据量很大时,我们定义的来接收数据的数组长度就需要随之改变;

思路:

        首先判断数据长度,然后用循环的方式来定义数组长度;

猜你喜欢

转载自blog.csdn.net/qq_57663276/article/details/128244977
今日推荐