You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:40:35