Retug
Retug

Reputation: 15

Data Not Showing up in Table

I am trying to follow a example of creating a table located here: https://pythonbasics.org/pyqt-table/

Full admission, I am new to python and this is a little foreign to me.

I have edited my dictionary to match my data, but when the table is populated on my computer, the values are blank.

I am at a loss of where I went wrong.

Any help would be appreciated.

Code snips below:

wb = xlrd.open_workbook(loc)  
sheet = wb.sheet_by_index(0)
x = []
labels = []
for i in range(sheet.nrows-3): 
   print(sheet.row_values(i+3)) 
   x.append(sheet.row_values(i+3))
   labels.append(str(x[i][0])+" "+str(x[i][1]))


z={}
keypieces = range(len(x))
#Making the Z dictionary
for i in keypieces: 
    z[labels[i]] = x[i][4:7]

class TableView(QTableWidget):
def __init__(self, z, *args):
    QTableWidget.__init__(self, *args)
    self.z = z
    self.setz()
    self.resizeColumnsToContents()
    self.resizeRowsToContents()

def setz(self): 
    horHeaders = []
    for n, key in enumerate(sorted(self.z.keys())):
        horHeaders.append(key)
        for m, item in enumerate(self.z[key]):
            newitem = QTableWidgetItem(item)
            self.setItem(m, n, newitem)
    self.setHorizontalHeaderLabels(horHeaders)

def main(args):
    app = QApplication(args)
    table = TableView(z, 3, 6)
    table.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    main(sys.argv)

My z dictionary is the following:

{'LEVEL 6 S1': [24.4999999999989, 5.00000000000394, 1.5],
 'LEVEL 5 S1': [25.4999999999992, 4.99999999999996, 1.5],
 'LEVEL 4 S1': [25.4999999999992, 4.99999999999996, 1.5],
 'LEVEL 3 S1': [25.4999999999992, 3.41666666666662, 1.5],
 'LEVEL 2 S1': [25.4999999999992, 3.91666666666663, 3.0],
 'LEVEL 1 S1': [25.4999999999992, 4.99999999999996, 1.33333333333333]}

My table looks like this (red is one example of what I want the table to look like):

Table image

Upvotes: 1

Views: 2258

Answers (1)

eyllanesc
eyllanesc

Reputation: 244301

The main error is that QTableWidgetItem supports only string, on the other hand the method you use to access the information is redundant. They consider the above the solution is:

def setz(self):
    horHeaders = []
    for j, (key, values) in enumerate(sorted(self.z.items())):
        horHeaders.append(key)
        for i, value in enumerate(values):
            newitem = QTableWidgetItem(str(value))
            # or
            # newitem = QTableWidgetItem()
            # newitem.setData(Qt.DisplayRole, value)
            self.setItem(i, j, newitem)
    self.setHorizontalHeaderLabels(horHeaders)

enter image description here

Update:

If you want to support numerical values and strings you must use the roles (Qt::DisplayRole or Qt::UserRole):

import sys
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt


class TableView(QTableWidget):
    def __init__(self, z, *args):
        super(TableView, self).__init__(*args)
        self.z = z
        self.setz()
        self.resizeColumnsToContents()
        self.resizeRowsToContents()

    def setz(self):
        horHeaders = []
        for j, (key, values) in enumerate(sorted(self.z.items())):
            horHeaders.append(key)
            for i, value in enumerate(values):
                newitem = QTableWidgetItem()
                newitem.setData(Qt.EditRole, value)
                self.setItem(i, j, newitem)
        self.setHorizontalHeaderLabels(horHeaders)


def main(args):

    z = {
        "LEVEL 6 S1": [24.4999999999989, 5.00000000000394, 1.5],
        "LEVEL 5 S1": [25.4999999999992, 4.99999999999996, 1.5],
        "LEVEL 4 S1": [25.4999999999992, 4.99999999999996, 1.5],
        "LEVEL 3 S1": [25.4999999999992, 3.41666666666662, 1.5],
        "LEVEL 2 S1": [25.4999999999992, 3.91666666666663, 3.0],
        "LEVEL 1 S1": [25.4999999999992, 4.99999999999996, 1.33333333333333],
    }

    app = QApplication(args)
    table = TableView(z, 3, 6)
    table.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main(sys.argv)

If instead you want to force all created columns to support floating values by default then you must set an appropriate editor, such as the QDoubleSpinBox, in the delegate

import sys
from PyQt5.QtWidgets import (
    QApplication,
    QDoubleSpinBox,
    QStyledItemDelegate,
    QTableWidget,
    QTableWidgetItem,
)
from PyQt5.QtCore import Qt


class Delegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        DBL_MAX = 1.7976931348623157e308
        editor = QDoubleSpinBox(parent, minimum=-DBL_MAX, maximum=DBL_MAX, decimals=323)
        return editor


class TableView(QTableWidget):
    def __init__(self, z, *args):
        super(TableView, self).__init__(*args)
        self.z = z
        self.setz()
        self.resizeColumnsToContents()
        self.resizeRowsToContents()

        delegate = Delegate(self)
        self.setItemDelegate(delegate)

    def setz(self):
        horHeaders = []
        for j, (key, values) in enumerate(sorted(self.z.items())):
            horHeaders.append(key)
            for i, value in enumerate(values):
                newitem = QTableWidgetItem()
                newitem.setData(Qt.EditRole, value)
                self.setItem(i, j, newitem)
        self.setHorizontalHeaderLabels(horHeaders)


def main(args):

    z = {
        "LEVEL 6 S1": [24.4999999999989, 5.00000000000394, 1.5],
        "LEVEL 5 S1": [25.4999999999992, 4.99999999999996, 1.5],
        "LEVEL 4 S1": [25.4999999999992, 4.99999999999996, 1.5],
        "LEVEL 3 S1": [25.4999999999992, 3.41666666666662, 1.5],
        "LEVEL 2 S1": [25.4999999999992, 3.91666666666663, 3.0],
        "LEVEL 1 S1": [25.4999999999992, 4.99999999999996, 1.33333333333333],
    }

    app = QApplication(args)
    table = TableView(z, 3, 6)
    table.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main(sys.argv)

Upvotes: 1

Related Questions