【问题标题】:PyQT dynamically, automatically changing color properties of table widgetPyQT 动态,自动更改表格小部件的颜色属性
【发布时间】:2017-04-21 17:19:57
【问题描述】:

由于我是 PyQt 的新手,我正在尝试解决动态更改表格单元格颜色的问题 - 非常欢迎帮助。

如果 for 循环 在数组中找到 1 或 0,

函数 testFunction 应该更改 tableWidget 颜色。是否可以设置此属性?盒子应该每 2 秒自动改变一次颜色,无需任何额外操作。检查下面的代码...

import sys, os
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle("Hello!")
        self.tableWidget = QtGui.QTableWidget()
        self.tableItem = QtGui.QTableWidgetItem()
        self.tableWidget.resize(400,250)
        self.tableWidget.setRowCount(1)
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setItem(0,0, QtGui.QTableWidgetItem("START TOOL"))
        self.tableWidget.item(0,0).setBackground(QtGui.QColor(100,100,150))

        realLayout = QtGui.QVBoxLayout()
        realLayout.addWidget(tableWidget)
        self.setLayout(realLayout)
        self.testFunction()

    def testFunction(self) :
        a = [1,0,1,1,1,1,1,0,0,0,0,0,1]
        for i in range(0,len(a)) :
            if a[i] == 1 :
                self.tableWidget.item(0,0).setBackground(QtGui.QColor(100,100,100))
            else :
                self.tableWidget.item(0,0).setBackground(QtGui.QColor(0,255,0))    
            time.sleep(2)

def main():
    app = QtGui.QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())

if __name__ == '__main__' :
    main()

【问题讨论】:

  • 您的代码不起作用,因为您需要先将数据添加到 tableWidget。目前,您的 tableWidget 是空的。这是一个关于如何添加数据的简单example。此外,您需要对tableWidget 进行单一引用,为此请改用self.tableWidget
  • 感谢@SyedElec。我已根据您的建议修改了代码。现在我仍然需要自动分配和更改表格单元格的颜色。主要思想是改变数组“a”中的项目应该会实时改变背景颜色。
  • @IvanB 如何更改数组“a”?
  • @eyllanesc 数组 "a" 将通过附加一些新的零和一值来动态更改(这不是这段代码的问题)

标签: python pyqt pyqt4 qtablewidget qtablewidgetitem


【解决方案1】:

您必须将realLayout.addWidget(tableWidget) 更改为realLayout.addWidget(self.tableWidget) 并且您不应该使用“睡眠”,必须创建一个计时器(QTimer)

import sys, os
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTimer


class MainWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle("Hello!")
        self.tableWidget = QtGui.QTableWidget()
        self.tableItem = QtGui.QTableWidgetItem()
        self.tableWidget.resize(400, 250)
        self.tableWidget.setRowCount(1)
        self.tableWidget.setColumnCount(1)
        self.tableWidget.setItem(0, 0, QtGui.QTableWidgetItem("START TOOL"))
        self.tableWidget.item(0, 0).setBackground(QtGui.QColor(100, 100, 150))

        realLayout = QtGui.QVBoxLayout()
        realLayout.addWidget(self.tableWidget)
        self.setLayout(realLayout)
        self.counter = 0
        self.a = [1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1]
        self.testFunction()

        timer = QTimer(self)
        timer.timeout.connect(self.testFunction)
        timer.start(2*1000)

    def testFunction(self):
        self.counter += 1
        self.counter %= len(self.a)
        if self.a[self.counter]:
            self.tableWidget.item(0, 0).setBackground(QtGui.QColor(100, 100, 100))
        else:
            self.tableWidget.item(0, 0).setBackground(QtGui.QColor(0, 255, 0))


def main():
    app = QtGui.QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【讨论】:

  • @SyedElec 它仍然无法正常工作。当程序到达计时器时,testFunction 在 for 循环中执行整个迭代过程,而不是逐步执行。一步一步将提供具有闪烁效果的表格单元格,所以我希望在达到计时器后 testFunction 只执行 a[0] 迭代并更改表格单元格的颜色,2 秒后,只有 a[1] 在 a[2] 和以此类推,并为每个状态更改颜色...
猜你喜欢
  • 2020-11-04
  • 2017-01-01
  • 2014-01-19
  • 1970-01-01
  • 2019-01-21
  • 2012-11-15
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多