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 (Python):通过 contextmenu 从 qpushbutton 获取值