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()

person Ivan B    schedule 06.12.2016    source источник
comment
Ваш код не работает, так как вам нужно сначала добавить данные в ваш tableWidget. В настоящее время ваш tableWidget пуст. Вот простой пример добавления данных. Также вам нужно иметь единственную ссылку на tableWidget, для этого используйте вместо этого self.tableWidget.   -  person SyedElec    schedule 07.12.2016
comment
Спасибо @SyedElec. Я изменил код в соответствии с вашими предложениями. Теперь мне все еще нужно автоматически назначать и изменять цвет для ячейки таблицы. Основная идея заключается в том, что изменение элементов в массиве a должно вызывать изменение цвета фона в реальном времени.   -  person Ivan B    schedule 07.12.2016
comment
@IvanB как изменить массив a?   -  person eyllanesc    schedule 07.12.2016
comment
Массив @eyllanesc a будет динамически изменяться путем добавления некоторых новых значений нулей и единиц (это не вопрос этого кода)   -  person Ivan B    schedule 08.12.2016


Ответы (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()
person eyllanesc    schedule 07.12.2016
comment
@SyedElec Это все равно не сработает. Когда программа достигает таймера, testFunction выполняет весь процесс итерации в цикле for, а не шаг за шагом. Шаг за шагом ячейка таблицы будет заполняться мигающим эффектом, поэтому я ожидал, что после достижения таймера testFunction выполнит только итерацию [0] и изменит цвет ячейки таблицы через 2 секунды, только [1] после [2] и так далее, и менять цвет для каждого состояния... - person Ivan B; 08.12.2016
comment
@IvanB см. это: meta.stackexchange.com/questions/5234/ - person eyllanesc; 09.12.2016