首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态QFrame显示

动态QFrame显示
EN

Stack Overflow用户
提问于 2018-04-10 16:25:57
回答 1查看 378关注 0票数 1

我正在尝试让PyQt5.QtWidgets.QFrame动态地更新他的颜色。

下面是代码( watch run()方法)

代码语言:javascript
复制
import sys 
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont
from time import sleep,time
from random import randint

class cadrillage(QWidget):  
    def __init__(self,grille_init,Largeur_grille, pause=0):
        """grille init vaudra 1 ou 0 : 0 pour une grille initialement toute blanche, 1 pour une grille randomisée"""

        super().__init__()
        self.Largeur_grille = Largeur_grille


    self.n_etape = 0
        self.cadri_init(grille_init)
        self.run(pause)


    def cadri_init(self,grille_init):
        """ définit la fenetre d'affichage et la grille initiale """
        t1 = time()
        self.setGeometry(890,150,1000,800)
        self.setWindowTitle("Grille à la {}_ème étape".format(self.n_etape))

        self.show()

        self.grid = QGridLayout()
        self.grid.setSpacing(0)    # pas d'espace entre les carrés
        self.setLayout(self.grid)

        if grille_init == 0:
            #définir grille_couleurs
            grille_couleurs=[0 for i in range(self.Largeur_grille) for j in range(self.Largeur_grille)]
            # 0 pour le blanc, 1 pour le noir

        if grille_init == 1:
            #définir grille_couleurs
            grille_couleurs=[randint(0,1) for i in range(self.Largeur_grille) for j in range(self.Largeur_grille)]


        self.positions = [(i,j) for i in range(self.Largeur_grille) for j in range(self.Largeur_grille)]

        self.grille_carre=[[None for i in range(self.Largeur_grille)] for j in range(self.Largeur_grille)]    

        for position,couleur in zip(self.positions,grille_couleurs):

            carre = QFrame(self)

            if couleur == 0:
                carre.setStyleSheet("QWidget { background-color: #ffffff}")
            if couleur == 1:
                carre.setStyleSheet("QWidget { background-color: #000000}")
            carre.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
            self.grid.addWidget(carre, *position)

            i,j = position
            self.grille_carre[i][j] = carre

        print(time()-t1)
        sleep(0.2)

    def run(self,pause):

        for k in range(3):

            a,b = randint(0,self.Largeur_grille-1),randint(0,self.Largeur_grille-1)
            self.grille_carre[a][b].setStyleSheet("QFrame{ background-color: #000000}")
        sleep(pause)

if __name__ =='__main__':
    app = QApplication(sys.argv)
    grille = cadrillage(0,10,0.5)
    sys.exit(app.exec_())

在run()方法中,我更改了一些QFrame小部件的颜色(self.grille_carre是一个QFrames列表),我可以看到这种更改在最终显示中起作用,但整个显示在整个程序运行后出现,我希望看到每个方块都被创建。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 16:38:06

不应该在主线程中使用阻塞任务,因为PyQt是在事件循环中执行的,这允许您查看其他事件,例如键盘、鼠标等。如果在更改中使用阻塞任务(比如睡眠),则GUI不会响应。您想要做的是一个周期性的任务,为此您必须使用QTimer (时间集以毫秒为单位)。

代码语言:javascript
复制
import sys 
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QFrame, QSizePolicy
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QTimer, QEventLoop
from time import sleep,time
from random import randint

class cadrillage(QWidget):  
    def __init__(self,grille_init,Largeur_grille, pause=0):
        """grille init vaudra 1 ou 0 : 0 pour une grille initialement toute blanche, 1 pour une grille randomisée"""

        super().__init__()
        self.Largeur_grille = Largeur_grille

        self.n_etape = 0
        self.cadri_init(grille_init)
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.run)
        self.counter = 0
        self.timer.start(pause)

    def cadri_init(self,grille_init):
        """ définit la fenetre d'affichage et la grille initiale """
        self.setGeometry(890,150,1000,800)
        self.setWindowTitle("Grille à la {}_ème étape".format(self.n_etape))

        self.show()

        self.grid = QGridLayout()
        self.grid.setSpacing(0)    # pas d'espace entre les carrés
        self.setLayout(self.grid)

        grille_couleurs=[0 if grille_init == 0 else randint(0,1) for i in range(self.Largeur_grille) for j in range(self.Largeur_grille)]

        self.positions = [(i,j) for i in range(self.Largeur_grille) for j in range(self.Largeur_grille)]

        self.grille_carre=[[None for i in range(self.Largeur_grille)] for j in range(self.Largeur_grille)]    

        for position,couleur in zip(self.positions,grille_couleurs):
            carre = QFrame(self)
            carre.setStyleSheet("QWidget {{ background-color: {}}}".format("#ffffff" if couleur == 0 else "#000000"))
            carre.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
            self.grid.addWidget(carre, *position)
            i,j = position
            self.grille_carre[i][j] = carre

    def run(self):
        self.counter += 1
        a,b = randint(0,self.Largeur_grille-1),randint(0,self.Largeur_grille-1)
        self.grille_carre[a][b].setStyleSheet("QFrame{ background-color: #000000}")
        if self.counter > 3:
            self.timer.stop()

if __name__ =='__main__':
    app = QApplication(sys.argv)
    grille = cadrillage(0,10,500)
    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49758612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档