【问题标题】:Tuple Index Out of Range (PyQt + Mysqldb)元组索引超出范围(PyQt + Mysqldb)
【发布时间】:2014-11-03 00:35:49
【问题描述】:

我从 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

感谢您的帮助,我正在记录这个问题,我想,它很容易解决,但我找不到正确的答案

【问题讨论】:

    标签: python mysql qt pyqt4 mysql-python


    【解决方案1】:

    我看到你的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

    【讨论】:

    • 嗯???请在添加表格之前显示cursor.fetchall() 的结果(通过打印到 cinsole)。谢谢。
    • (('BRA001', 'ARCELIA EUGENIA'), ('DTA001', 'ALEJANDRA'), ('EDM001', 'ESPACIOS DE DISENO Y MUEBLES'), ('EIE001', '埃德蒙多') ...
    • 这对我来说很好用。嗯?检查您的代码并在我的答案中尝试QTableWidget 示例。
    • 对不起,这是我的错……我没有正确的缩进
    • 如何更改标题(tableView中的1和2)? (对不起,如果有其他问题)如果这个..不正确,请顺便说一句,我编辑我的问题并提出......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2021-03-02
    • 2018-11-16
    • 2016-04-04
    • 2020-06-08
    • 2017-07-12
    相关资源
    最近更新 更多