元组索引超出范围(PyQt + Mysqldb)

-1 投票
1 回答
1174 浏览
提问于 2025-04-20 16:16

我在用PyQt4做一个表单,参考了之前一个回答的例子,但我遇到了“元组索引超出范围”的错误。我的代码如下。

 cursor.execute("SELECT id_cliente as 'Codigo del cliente', nombre AS 'Nombre' FROM t_clientes")
        row = cursor.fetchall()
        if row  == None:
            QtGui.QMessageBox.warning(self, "Error", "No hay Datos .... " , QtGui.QMessageBox.Ok)
            return
        ver_tabla.setRowCount(len(row))
        ver_tabla.setColumnCount(3)
        ##rellenamos la tabla con los datos ...
        for i in range (len(row)):
            for j in range (3):
                item = QTableWidgetItem('%s' % (row[i][j + 1]))
                ver_tabla.setItem(i, j, item)
        layout_btn_clientes.addWidget(ver_tabla,3,0,5,3)

文件 "/home/admino/Proyectos/TM/recursosh.py",第102行,在 init 中 item = QTableWidgetItem('%s' % (row[i][j + 1])) IndexError: tuple index out of range

谢谢大家的帮助,我在记录这些问题,我觉得这个问题应该很简单解决,但我找不到合适的答案。

1 个回答

0

根据你的 SQL 代码,结果应该是 2 列 x N 行(N 是记录的数量);

SELECT id_cliente as 'Codigo del cliente', nombre AS 'Nombre' FROM t_clientes

所以,记录的 tuple 应该看起来像这样(2 列 x N 行);

record = (
    (u'Data column 1.1', u'Data column 1.2'),
    (u'Data column 2.1', u'Data column 2.2'),
    ...
    (u'Data column M.N', u'Data column M.N'),
)

然后可以通过循环 for 来显示所有记录中的数据,这样使用起来很方便;

for row in range (len(record)):
    for column in range(len(record[row])): # For proof concept. I know is overhead, your can replace with 2.
        print record[row][column]

所以你的问题,错误是 Index Out of Range,这是 Python 报的错。要解决这个问题,请在使用索引之前先计算好正确的索引值(不要直接写死在代码里);

cursor.execute("SELECT id_cliente as 'Codigo del cliente', nombre AS 'Nombre' FROM t_clientes")
listsRecord = cursor.fetchall()
if listsRecord:
    QtGui.QMessageBox.warning(self, "Error", "No hay Datos .... " , QtGui.QMessageBox.Ok)
    return

lengthRow    = len(listsRecord)
lengthColumn = len(listsRecord[0]) # column is 2 at all
yourQTableWidget.setRowCount(lengthRow)
yourQTableWidget.setColumnCount(lengthColumn)
for row in range (lengthRow):
    for column in range (lengthColumn):
        itemQTableWidgetItem = QtGui.QTableWidgetItem(str(listsRecord[row][column]))
        yourQTableWidget.setItem(row, column, itemQTableWidgetItem)

测试的例子;

import sys
from PyQt4 import QtGui

myQApplication   = QtGui.QApplication(sys.argv)
yourQTableWidget = QtGui.QTableWidget()
listsRecord = (('BRA001', 'ARCELIA EUGENIA'), ('DTA001', 'ALEJANDRA'), ('EDM001', 'ESPACIOS DE DISENO Y MUEBLES'), ('EIE001', 'EDMUNDO')) # Simulate data
lengthRow    = len(listsRecord)
lengthColumn = len(listsRecord[0])
yourQTableWidget.setRowCount(len(listsRecord))
yourQTableWidget.setColumnCount(lengthColumn)
for i in range (lengthRow):
    for j in range (lengthColumn):
        item = QtGui.QTableWidgetItem(str(listsRecord[i][j]))
        yourQTableWidget.setItem(i, j, item)
yourQTableWidget.show()
sys.exit(myQApplication.exec_())

实验结果 : Windows 7, Python 2.7 x86, PyQt4

在这里输入图片描述

撰写回答