J'ai récemment créé un programme de feux de stop (GUI) et je ne peux pas comprendre ce qui est faux.Je ne sais pas comment inclure le QTimer ou une fonction pour retarder le changement de couleur et j'ai essayé la fonction show pour finir par obtenir deux programmes i ne sais vraiment pas comment réparer mon code, mais pouvez-vous m'aider?

import PyQt5, sys, time,os
from os import system,name
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QPoint,QTimerEvent,QTimer,Qt
from PyQt5.QtWidgets import QWidget,QApplication,QMainWindow
from PyQt5.QtGui import QPainter
class Stoplight(QMainWindow):
    def __init__(self,parent = None):
        QWidget.__init__(self,parent)
        self.setWindowTitle("Stoplight")
        self.setGeometry(500,500,250,510)
    def paintEvent(self,event):
        radx = 50
        rady = 50
        center = QPoint(125,125)
        p = QPainter()
        p.begin(self)
        p.setBrush(Qt.white)
        p.drawRect(event.rect())
        p.end()

        p1 = QPainter()
        p1.begin(self)
        p1.setBrush(Qt.red)
        p1.setPen(Qt.black)
        p1.drawEllipse(center,radx,rady)
        p1.end()
class Stoplight1(Stoplight):
    def __init__(self,parent = None):
        QWidget.__init__(self,parent)
        self.setWindowTitle("Stoplight")
        self.setGeometry(500,500,250,510)
    def paintEvent(self,event):
        radx = 50
        rady = 50
        center = QPoint(125,125)
        p = QPainter()
        p.begin(self)
        p.setBrush(Qt.white)
        p.drawRect(event.rect())
        p.end()

        p1 = QPainter()
        p1.begin(self)
        p1.setBrush(Qt.green)
        p1.setPen(Qt.black)
        p1.drawEllipse(center,radx,rady)
        p1.end()
if __name__ == "__main__":
    application = QApplication(sys.argv)
    stoplight1 = Stoplight()
    stoplight2 = Stoplight1()
    time.sleep(1)
    stoplight1.show()
    time.sleep(1)
    stoplight2.show()
sys.exit(application.exec_())
2
Jansen Lloyd Macabangun 10 mars 2019 à 17:31

2 réponses

Meilleure réponse

Bien que la réponse de @f.wue fonctionne apparemment, elle n'est pas correcte car vous ne devez pas utiliser time.sleep() dans le thread de l'interface graphique car il gèle l'application, par exemple essayez de redimensionner la fenêtre tout en exécutant le time.sleep().

Au lieu de cela, vous devez utiliser un QTimer comme vous le dites, ce minuteur doit se connecter à une fonction qui change la couleur et appeler la méthode update() qui appelle indirectement l'événement paintEvent(). Puisque vous voulez que les couleurs changent de couleur de manière cyclique, vous devez créer un itérateur cyclique.

from itertools import cycle
from PyQt5 import QtCore, QtGui, QtWidgets

class TrafficLight(QtWidgets.QMainWindow):
    def __init__(self,parent = None):
        super(TrafficLight, self).__init__(parent)
        self.setWindowTitle("TrafficLight ")
        self.traffic_light_colors = cycle([
            QtGui.QColor('red'),
            QtGui.QColor('yellow'),
            QtGui.QColor('green')
        ])
        self._current_color = next(self.traffic_light_colors)
        timer = QtCore.QTimer(
            self, 
            interval=2000, 
            timeout=self.change_color
        )
        timer.start()
        self.resize(200, 400)

    @QtCore.pyqtSlot()
    def change_color(self):
        self._current_color = next(self.traffic_light_colors)
        self.update()

    def paintEvent(self, event):
        p = QtGui.QPainter(self)
        p.setBrush(self._current_color)
        p.setPen(QtCore.Qt.black)
        p.drawEllipse(self.rect().center(), 50, 50)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = TrafficLight()
    w.show() 
    sys.exit(app.exec_())
2
eyllanesc 10 mars 2019 à 20:17

Ce serait un indice pour y parvenir. Vous devez définir certaines fonctions ou objets pour gérer les différents emplacements des cycles. De plus, utilisez la fonction self.update() pour appeler les paintEvent et application.processEvents() pour rendre les modifications visibles dans l'interface graphique. Vous pouvez utiliser le code dans la partie exécution et en générer une fonction plus sophistiquée.

MODIFIER: Essayez cette approche avec un dictionnaire, car il contient moins de code.

import PyQt5, sys, time,os
from os import system,name
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QPoint,QTimerEvent,QTimer,Qt
from PyQt5.QtWidgets import QWidget,QApplication,QMainWindow
from PyQt5.QtGui import QPainter
class Stoplight(QMainWindow):
    def __init__(self,parent = None):
        QWidget.__init__(self,parent)
        self.setWindowTitle("Stoplight")
        self.setGeometry(500,500,250,510)
        self.radx = 50
        self.rady = 50
        self.traffic_light_dic = {"red":{"QColor":Qt.red,
                                         "center":QPoint(125,125)},
                                  "yellow": {"QColor": Qt.yellow,
                                          "center": QPoint(125, 250)},
                                  "green": {"QColor": Qt.green,
                                          "center": QPoint(125, 375)},
                                  }
    def switch_to_color(self, color):
        self.center = self.traffic_light_dic[color]["center"]
        self.color = self.traffic_light_dic[color]["QColor"]
        self.update()
    def paintEvent(self, event):
        p = QPainter()
        p.begin(self)
        p.setBrush(self.color)
        p.setPen(Qt.black)
        p.drawEllipse(self.center, self.radx,self.rady)
        p.end()

if __name__ == "__main__":
    application = QApplication(sys.argv)
    stoplight1 = Stoplight()
    stoplight1.show()
    time.sleep(2)
    stoplight1.switch_to_color("red")
    application.processEvents()
    time.sleep(2)
    stoplight1.switch_to_color("yellow")
    application.processEvents()
    time.sleep(2)
    stoplight1.switch_to_color("green")
    application.processEvents()
    sys.exit(application.exec_())
0
f.wue 10 mars 2019 à 16:06