PyQt5如何使用python在迭代循环中更新单元格值Qtablewidget

Posted

技术标签:

【中文标题】PyQt5如何使用python在迭代循环中更新单元格值Qtablewidget【英文标题】:PyQt5 How can I update cell value Qtablewidget in iteration loop using python 【发布时间】:2021-01-25 12:01:41 【问题描述】:

我想逐行更新单元格。就像在 Ajax 中一样,表值逐行更新。目前我正在使用迭代循环来逐行更新表。但它不会逐行更新后台进程运行时也会冻结 GUI。 有没有其他方法可以实现逐行更新。 创建表我使用了 QtableWidget。

        with open('test.csv') as f:
            reader = csv.DictReader(f)
            for i,row in enumerate(reader):
                print("i",i)
                print(row)
                marks= row['Marks']
                total= self.total(marks)
                self.tableWidget.setItem(i, 4, QTableWidgetItem(str(total)))
                time.sleep(1)

获取冻结 GUI 并且不逐行更新的问题。 我想一一更新。 请给我建议,提前谢谢。

【问题讨论】:

尝试将QApplication.processEvents()添加到for循环的末尾。 谢谢@ekhumoro 它正在按我的意愿工作 【参考方案1】:

在 UI 程序中永远不应该发生阻塞(至少,不会在它的 主线程中发生):GUI 框架使用一个事件循环,它不断地处理来自系统(包括用户交互)并允许正确的渲染更新。

只有当函数将控制权返回给事件循环时,UI 才能正确更新自身,在您的情况下,直到函数结束才会发生这种情况,这可能需要一段时间,因为 time.sleep

为了执行“延迟”和重复的任务,您可以使用QTimer

    def fillTable(self):
        with open('test.csv') as f:
            self.csvIterator = csv.DictReader(f)

        self.fillRow = 0
        self.fillTimer = QtCore.QTimer()
        self.fillTimer.setInterval(1000)
        self.fillTimer.timeout.connect(self.updateTable)
        self.fillTimer.start()

    def updateTable(self):
        try:
            row = next(self.csvIterator)
        except StopIteration:
            self.fillTimer.stop()
            return
        print('i', self.fillRow)
        print(row)
        marks = row['Marks']
        total = self.total(marks)
        self.tableWidget.setItem(self.fillRow, 4, QTableWidgetItem(str(total)))
        self.fillRow += 1

【讨论】:

以上是关于PyQt5如何使用python在迭代循环中更新单元格值Qtablewidget的主要内容,如果未能解决你的问题,请参考以下文章

如何在这个 pyqt5 窗口中使用 while 循环

如何在表格视图单元格中快速迭代for循环

PyQt5 (Python):通过 contextmenu 从 qpushbutton 获取值

如何在 PyQt5 中设置 QTableWidget 的单元格样式?

如何在 Python 3 中迭代 Unicode 字符?

在python中迭代和更新列表[重复]