Reputation: 15
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):
Upvotes: 1
Views: 2258
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)
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