在 QtableWidget 中使用字典处理

Posted

技术标签:

【中文标题】在 QtableWidget 中使用字典处理【英文标题】:Handle with dictionary in QtableWidget 【发布时间】:2019-03-17 10:29:01 【问题描述】:

我的项目中有一个 CSV 模块,可以从 CSV 文件导入数据。 “generateCsvData”方法将其转换为字典,我想将数据插入到许多 QtableWidgets 中(取决于一些处理和计算)。例如“updateData”可以将一个项目插入到第二个 QtableWidget 的单元格(24,5)中,这里的问题是,当我想执行程序和读取设置时,在调试控制台中显示: 没有任何。 我知道python对全局范围结果的第一个值的引用=

class MyWindow(QMainWindow):
    def __init__(self, aPath, parent=None):
        super(MyWindow, self).__init__(parent)
        self.delimit = '\t'
        self.fileName = ""
        self.result = 

def generateCsvData(self, fileName):
        f = open(fileName, 'r')
        mystring = f.read()
        if mystring.count(",") > mystring.count('\t'):
            if mystring.count(",") > mystring.count(';'):
                self.delimit = ","
            elif mystring.count(";") > mystring.count(','):
                self.delimit = ";"
            else:
                self.delimit = "\t"
        elif mystring.count(";") > mystring.count('\t'):
            self.delimit = ';'
        else:
            self.delimit = "\t"
        f.close()
        f = open(fileName, 'r') 
        with f:
            f = open(fileName, 'r')
            reader = csv.reader(f, delimiter=self.delimit)
            header=[[head] for head in next(reader)]
            for row in reader:
                key = row[0]  #####
                print(row)
                if key in self.result:
                        pass
                self.result[key] = (row [1:])
            print (self.result)

def updateData(self, k, v, n, m):
    print (self.result)
    #print("Value : %s" % self.result.get(k, "Never"))
    item = self.result.get(k)[v]
    print(item)
    newItem = QTableWidgetItem(str(item))
    newItem.setForeground(QBrush(QColor(255, 0, 0)))
    self.ui.tableWidget_Bilan.setItem(n, m, newItem)

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = MyWindow('')
    main.updateData(k="11110000", v=0, n=24, m=4)  
    main.setMinimumSize(820, 300)
    main.show()

sys.exit(app.exec_())

当我单击按钮执行“updateData”方法时,我得到 TypeError:updateData() 缺少 3 个必需的位置参数:'v'、'n' 和 'm'。那么我该如何使用“updateData”,或者在字典满后的任何其他方法?请有任何想法,谢谢!

【问题讨论】:

您是否有缩进问题,或者只是标记问题? updateData 方法应该在 myWindow ... 问题是,这个来自file_2.py 的MyWindow 类继承了QT Designer 创建的Class Ui_MainWindow() 的一些属性,它有一个QtableWidget 作为(tableWidget_Bilan) 和file_1.py 中的许多其他QtableWidget。当我执行程序时,它会加载 CSV 文件并将其插入到第一个 QtableWidget 以显示项目,并在必要时对其进行修改。我的下一个方法是将 CSV 文件转换为 dict 的方法,它将在加载过程之后在 loadCsv 方法中执行。我得到的 TypeError 是因为第一个状态的字典是空的。希望你能理解我 【参考方案1】:

试试看:

ma​​in.py

import csv
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self, aPath, parent=None):
        super(MyWindow, self).__init__(parent)

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(55)
        self.tableWidget.setColumnCount(14)

        conLayout = QHBoxLayout(centralWidget)
        conLayout.addWidget(self.tableWidget)

        self.fileName = "csv.csv"                              # +
        self.result   = 

        self.generateCsvData(self.fileName)                    # +

    def generateCsvData(self, fileName):                       # +
        with open(fileName, "r") as fileInput:                    
            for i, row in enumerate(csv.reader(fileInput)):
                if i:
                    self.result[row[0]] = (row[1:])

    def updateData(self, k, v, n, m):
        [print(kk, vv) for kk, vv in self.result.items()]

        item = self.result.get(k)[v]
        print("\nitem =``".format(item))

        newItem = QTableWidgetItem(str(item))
        newItem.setForeground(QBrush(QColor(255, 0, 0)))
#        self.ui.tableWidget_Bilan.setItem(n, m, newItem)    # -
        self.tableWidget.setItem(n, m, newItem)              # +

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = MyWindow('')
    main.updateData(k="11110000", v=0, n=24, m=4)  
    main.setMinimumSize(820, 300)
    main.show()
    sys.exit(app.exec_())

csv.csv

key,    item1,  item2, item3,  item4,  item5,  item6,  item7, item8, item9, item10, item11, item12, item13
1111, Title 1,  12521, 94565,       ,       ,       , 684651,      ,      ,  44651,       ,       ,  
1112, Title 2,  65115,      , 466149,  46645, 555641,       ,      ,      , 412045,  98416,       ,  
1113, Title 3, 243968,      ,       , 466149,  46645, 555641, 98656,      ,       , 412045,  98416, 
11110000,Title 4,243968,    ,       , 466149,  46645, 555641, 98656,      ,       , 412045,  98416, 


更新

import csv
from PyQt5.QtCore    import *
from PyQt5.QtGui     import *
from PyQt5.QtWidgets import *

class MyWindow(QMainWindow):
    def __init__(self, aPath, parent=None):
        super(MyWindow, self).__init__(parent)

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setRowCount(55)
        self.tableWidget.setColumnCount(14)

        button = QPushButton("Select csv file")               # +
        button.clicked.connect(self.selectCsvFile)            # +

        conLayout = QHBoxLayout(centralWidget)
        conLayout.addWidget(self.tableWidget)
        conLayout.addWidget(button)                           # +

        self.fileName = ""                                    # - "csv.csv"                           
        self.result   = 

    def generateCsvData(self, fileName):                       
        with open(fileName, "r") as fileInput:                    
            for i, row in enumerate(csv.reader(fileInput)):
                if i:
                    self.result[row[0]] = (row[1:])

        if self.result:                                       # +
            self.updateData(k="11110000", v=0, n=24, m=4)     # +   !!!         

    def updateData(self, k, v, n, m):
        if not self.result: return                            # +

        [print(kk, vv) for kk, vv in self.result.items()]

        item = self.result.get(k)[v]
        print("\nitem =``".format(item))

        newItem = QTableWidgetItem(str(item))
        newItem.setForeground(QBrush(QColor(255, 0, 0)))
        self.tableWidget.setItem(n, m, newItem)              

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def selectCsvFile(self):
        self.fileName, _ = QFileDialog.getOpenFileName(
                           self, 
                           'Open file', 
                           '',
                           "Csv Files (*.csv)")
        if self.fileName: 
            print("\n  \n".format(self.fileName))
            self.generateCsvData(self.fileName)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^    


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    app.setApplicationName('MyWindow')
    main = MyWindow('')
#    main.updateData(k="11110000", v=0, n=24, m=4)            # --- !!!
    main.setMinimumSize(820, 300)
    main.show()
    sys.exit(app.exec_())

【讨论】:

显示我使用这个 self.fileName = " " 并创建一个方法来获取文件,因为每次我都会加载不同的文件名?再次感谢兄弟 S.Nick,如果你愿意,我想联系你 问题是,这个来自file_2.py 的MyWindow 类继承了QT Designer 创建的Class Ui_MainWindow() 的一些属性,它有一个QtableWidget 作为(tableWidget_Bilan) 和file_1.py 中的许多其他QtableWidget。当我执行程序时,它会加载一个 CSV 文件并将其插入到第一个 QtableWidget 以显示项目,并在必要时对其进行修改。我的下一个方法是将 CSV 文件转换为 dict 的方法,它将在加载过程之后在 loadCsv 方法中执行。我得到的 TypeError 是因为第一个状态的字典是空的。希望你能理解我 作为回应,我添加了第二个适合您的示例 :) @AnassBelmaati 好好想想你想做什么,描述这个想法,举例说明你的工作。但这是另一个问题。我认为当前问题已结束。

以上是关于在 QtableWidget 中使用字典处理的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget表头样式

将列表字典传递给 Qtablewidget - PyQT5

从具有值列表的字典创建 Pyqt QtableWidget,然后返回字典

如何从 QtableWidgetItem 创建字典?

在 QtableWidget 中插入多项

如何使用 cellWidget 处理来自 QTableWidget 单元的信号