Table 中未显示数据
Data Not Showing up in Table
我正在尝试按照创建位于此处的 table 的示例进行操作:
https://pythonbasics.org/pyqt-table/
完全录取,我是python的新手,这对我来说有点陌生。
我已经编辑了我的字典来匹配我的数据,但是当 table 在我的计算机上填充时,值是空白的。
我不知道哪里出错了。
如有任何帮助,我们将不胜感激。
下面的代码片段:
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)
我的 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]}
我的 table 看起来像这样(红色是我希望 table 看起来像的一个例子):
主要错误是QTableWidgetItem 只支持字符串,另一方面你用来访问信息的方法是多余的。他们认为以上解决方案是:
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)
更新:
如果你想支持数值和字符串,你必须使用角色(Qt::DisplayRole 或 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)
如果您想强制所有创建的列默认支持浮动值,那么您必须在委托中设置适当的编辑器,例如 QDoubleSpinBox
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)
我正在尝试按照创建位于此处的 table 的示例进行操作: https://pythonbasics.org/pyqt-table/
完全录取,我是python的新手,这对我来说有点陌生。
我已经编辑了我的字典来匹配我的数据,但是当 table 在我的计算机上填充时,值是空白的。
我不知道哪里出错了。
如有任何帮助,我们将不胜感激。
下面的代码片段:
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)
我的 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]}
我的 table 看起来像这样(红色是我希望 table 看起来像的一个例子):
主要错误是QTableWidgetItem 只支持字符串,另一方面你用来访问信息的方法是多余的。他们认为以上解决方案是:
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)
更新:
如果你想支持数值和字符串,你必须使用角色(Qt::DisplayRole 或 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)
如果您想强制所有创建的列默认支持浮动值,那么您必须在委托中设置适当的编辑器,例如 QDoubleSpinBox
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)