目录
一、背景
因课程设计需要使用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
不可否认,这不一定是一个好方法,当数据量很大时,我们定义的来接收数据的数组长度就需要随之改变;
思路:
首先判断数据长度,然后用循环的方式来定义数组长度;