Python中TableWidgets报错‘NoneType’ object has no attribute ‘text’求解
解决QTableWidget中
NoneType' object has no attribute 'text'的问题 这个报错的核心原因很明确:当你调用self.tableWidget.item(i,0)时,这个单元格还没有被创建过QTableWidgetItem对象,所以返回了None,紧接着调用.text()自然就会触发NoneType属性错误。之前的项目能正常运行,大概率是因为预先给表格的所有行/单元格初始化了空的QTableWidgetItem,所以不会返回None。
下面给你几个可行的解决方案,按推荐程度排序:
方案1:先检查Item是否存在,再判断内容
修改你的循环判断逻辑,先确认item不是None,再去读取它的文本内容:
def add_table (self): self.kala = self.comboBox.currentText() self.code_kala = self.comboBox.currentIndex() self.vahed = self.comboBox_2.currentText() list_e = [] for i in range(10): item = self.tableWidget.item(i, 0) # 先判断item存在,再检查文本非空 if item is not None and item.text().strip() != '': list_e.append(i) self.ROW = len(list_e) # 注意:如果ROW等于10,说明前10行都有内容,需要先新增一行 if self.ROW >= self.tableWidget.rowCount(): self.tableWidget.insertRow(self.ROW) self.tableWidget.setItem(self.ROW,0,QTableWidgetItem(self.kala)) self.tableWidget.setItem(self.ROW,1,QTableWidgetItem(str(self.code_kala))) self.tableWidget.setItem(self.ROW,2,QTableWidgetItem(str(self.vahed)))
这里加了.strip()是为了过滤掉只含空格的空内容,逻辑更严谨。
方案2:遍历表格实际存在的行(更灵活)
不要硬编码循环10次,而是用rowCount()获取表格当前的实际行数,这样不管表格有多少行都能适配:
def add_table (self): self.kala = self.comboBox.currentText() self.code_kala = self.comboBox.currentIndex() self.vahed = self.comboBox_2.currentText() list_e = [] # 遍历当前表格的所有行 for i in range(self.tableWidget.rowCount()): item = self.tableWidget.item(i, 0) if item and item.text().strip() != '': list_e.append(i) self.ROW = len(list_e) if self.ROW >= self.tableWidget.rowCount(): self.tableWidget.insertRow(self.ROW) self.tableWidget.setItem(self.ROW,0,QTableWidgetItem(self.kala)) self.tableWidget.setItem(self.ROW,1,QTableWidgetItem(str(self.code_kala))) self.tableWidget.setItem(self.ROW,2,QTableWidgetItem(str(self.vahed)))
方案3:直接寻找第一个空行(效率更高)
其实你不需要收集所有非空行的索引,直接从第一行开始找第一个没有item或者内容为空的行即可,这样代码更简洁,效率也更高:
def add_table (self): self.kala = self.comboBox.currentText() self.code_kala = self.comboBox.currentIndex() self.vahed = self.comboBox_2.currentText() self.ROW = 0 # 遍历现有行,找第一个空行 while self.ROW < self.tableWidget.rowCount(): item = self.tableWidget.item(self.ROW, 0) if not item or item.text().strip() == '': break self.ROW += 1 # 如果所有行都有内容,新增一行 if self.ROW >= self.tableWidget.rowCount(): self.tableWidget.insertRow(self.ROW) # 设置单元格内容 self.tableWidget.setItem(self.ROW,0,QTableWidgetItem(self.kala)) self.tableWidget.setItem(self.ROW,1,QTableWidgetItem(str(self.code_kala))) self.tableWidget.setItem(self.ROW,2,QTableWidgetItem(str(self.vahed)))
另外提醒一下:如果你的表格允许用户手动删除行,或者动态调整行数,方案2和3会比硬编码10行更健壮,能避免很多边界问题。
内容的提问来源于stack exchange,提问作者PHM La
相关产品推荐
相关产品推荐

