2016-12-06 20 views
0

由于我是PyQt中的新手,我试图通过动态改变表格单元格的颜色来解决问题 - 帮助是非常值得欢迎的。PyQT动态地自动改变表格部件的颜色属性

功能testFunction应该改变tableWidget颜色如果for循环在阵列发现1或0是否有可能设置该属性?盒子应该每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() 
+0

因为你您的代码不工作需要先将数据添加到你的tableWidget中。目前,你的tableWidget是空的。这里是一个简单的[示例](https://pythonspot.com/en/qt4-table/),介绍如何添加数据。你也需要有一个对'tableWidget'的引用,用于'self.tableWidget'。 – SyedElec

+0

谢谢@SyedElec。我已根据您的建议修改代码。现在我仍然需要自动分配颜色并将其更改为表格单元格。主要想法是,更改数组“a”中的项目应该会导致实时更改背景颜色。 –

+0

@IvanB如何更改数组“a”? – eyllanesc

回答

0

您必须更改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() 
+0

@SyedElec它仍然不起作用。当程序到达定时器时,testFunction在for循环中执行整个迭代过程,而不是一步一步地执行。一步一步地给表格单元格带来闪烁效果,所以我预计在达到定时器之后,testFunction只执行[0]迭代并在2秒后改变表格单元格的颜色,在[2]之后只改变一个[1]和等等,并改变每种状态的颜色... –

+0

@SyedElec更新我的解决方案 – eyllanesc

+0

@ eyllanesc这是完美的!谢谢!这个问题可能会被关闭! –