Partage
  • Partager sur Facebook
  • Partager sur Twitter

Graphique python

Sujet résolu
    11 décembre 2015 à 17:23:26

    Bonjour, étant absent durant un certain temps je n'ai pas pus aller à mes cours. Or on doit rendre un programme qui permet de jouer au ping pong. Si je demande votre aide aujourd'hui ce serai pour comprendre le programme. 

    Est ce que vous pouvez m'expliquer les fonctions de ce programme afin que je puisse le finir s'il vous plait. Ceci est le programme de base qu'il nous as donné. J'ai essayé d'ajouter des  fonction dans animate.

    from PyQt5.QtWidgets import (QApplication, QMainWindow)
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import (QPainter,QColor,QPen,QBrush)
    from PyQt5.QtCore import QTimer
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.setWindowTitle('My First window')
            self.setWindowOpacity (5)
            #self.setMouseTracking(True)
            self.rx = 10
            self.ry = 10
            self.bx = 50
            self.by = 50
            self.bd = 20
            self.vx = 5
            self.vy = 0
            self.tm = QTimer ()
            self.tm.timeout.connect(self.animate)
            self.tm.start(40)
    
    
        def mouseMoveEvent(self, e):
            print (e.x(),e.y())
    
    
    
        def keyPressEvent(self, e):
            code = e.key()
            if (code == Qt.Key_Up):
                #print("UP")
                self.ry -= 5
                if (self.ry < 10):
                    self.ry = 10
            elif (code == Qt.Key_Down):
                #print("DOWN")
                self.ry += 5
            if (code == Qt.Key_F):
                self.fullModeTuggle()
                self.repaint ()
            if (self.ry > self.height()-50):
                    self.ry = self.height()-50
            elif (code == Qt.Key_Right):
                print("RIGHT")
            elif (code == Qt.Key_Left):
                print("LEFT")
            self.repaint()
    
        def paintEvent(self, e):
            painter = QPainter(self)
            painter.fillRect(self.rx, self.ry, 10, 40, QColor(0,0,255))
            if (self.rx == self.vx) and (self.ry-5<self.by<self.ry+25):
                self.vx = - self.vx
            color=QColor(0,200,200)
            painter.setPen(QColor(255,255,0))
            pen = QPen()
            pen.setColor(color)
            painter.setPen(pen)
            brush = QBrush()
            brush.setColor(color)
            brush.setStyle(Qt.SolidPattern)
            painter.setBrush(brush)
            painter.drawEllipse(self.bx, self.by,self.bd, self.bd)
    
        def animate (self):
            self.bx += self.vx
            self.by += self.vy
            if (self.bx <= self.rx and self.ry-40 <= self.by <= self.ry):
                self.vx = -self.vx
            elif (self.bx + self.bd >= self.width()):
                self.vx = -self.vx
            elif (self.bx <= 0):
                self.vx = -self.vx
            """
            if (self.bx <= self.rx + 10) and (self.by >= self.ry) and (self.by <= self.ry + 40):
                self.bx = self.rx + 10
                self.vx = -self.vx
    
            elif (self.bx + self.bd >= self.width()):
                self.bx = self.width () - self.bd
                self.vx = -self.vx
            elif (self.by  + self.bd >= self.width()):
                self.by= self.width() - self.bd
            elif (self.bx + self.bd):
                self.vy = -self.vy
            elif (self.by + self.bd>=self.height()):
                self.vy = -self.vy
            """
            self.repaint()
    
    if __name__ == '__main__':
    
        import sys
    
        app = QApplication(sys.argv)
        mainWin = MainWindow()
        mainWin.show()
        sys.exit(app.exec_())

     Meci beaucoup de votre aide!

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 décembre 2015 à 19:33:25

      Tu peux te renseigner par toi même, tout seul, dans les documentations appropriées (les deux premiers liens sont parfaits). Néanmoins je suis d'accord pour dire que c'est très fourni comme documentation, et qu'on peut très vite s'y perdre ou mettre beaucoup de temps à comprendre, donc je vais essayer de t'aider à dégrossir.

      from PyQt5.QtWidgets import (QApplication, QMainWindow)
      from PyQt5.QtCore import Qt
      from PyQt5.QtGui import (QPainter,QColor,QPen,QBrush)
      from PyQt5.QtCore import QTimer

      Pour Qt, un widget est un élément graphique. QApplication est l'objet de base qui va te permettre d’exécuter la partie graphique de ton programme. QMainWindow est la classe qui va gérer la fenêtre principale (les menus déroulants tels les classiques "fichier" ou "éditer" d'un éditeur de texte lambda comme l'agencement des widgets dans la fenêtre).

      La seconde ligne importe les éléments centraux qui permettent à Qt de fonctionner, d'où le nom QtCore.

      Le module QtGui va, comme son nom l'indique aussi, s'occuper de la partie graphique. Ici les 4 classes importées servent à dessiner:

      • QPainter est la classe qui va dessiner l'image que tu lui demande.
      • Pour fonctionner QPainter a besoin d'un QPen.
      • Les options de dessins vont être stockées dans QBrush.
      • Les couleurs vont être modélisées par QColor.

      Finalement QTimer va servir à gérer le temps.

      Tu remarqueras que tout est explicite si tu parles un peu anglais ou que tu sais te servir d'un traducteur en ligne.

      def __init__(self):
          super(MainWindow, self).__init__()
          self.setWindowTitle('My First window')
          self.setWindowOpacity (5)
          #self.setMouseTracking(True)
          self.rx = 10
          self.ry = 10
          self.bx = 50
          self.by = 50
          self.bd = 20
          self.vx = 5
          self.vy = 0
          self.tm = QTimer ()
          self.tm.timeout.connect(self.animate)
          self.tm.start(40)

      C'est la méthode qui va être appelée à chaque instanciation de ta classe MainWindow. Normalement tu n'instancie qu'une seule classe MainWindow, et toutes les instructions définissent des paramètres utiles à la suite du programme et décrivent la fenêtre principale (en particulier le titre de la fenêtre et des options de MouseTracking).

      def mouseMoveEvent(self, e):
          print (e.x(),e.y())

      Fonction appelée... à chaque fois que la souris bouge (comme son nom l'indique :-°). Attention, si le MouseTracking n'est pas activé, je ne suis pas sur que la fonction soit appelée à chaque mouvement de la souris. Va vérifier dans la documentation ;)

      def keyPressEvent(self, e)

      Connaissance en anglais ou traducteur automatique. Dans les deux cas tu devrais pouvoir comprendre assez vite, c'est plutôt explicite. Si tu ne comprends pas les fonctions/variables utilisées à l'intérieur de la fonction, vas voir sur la documentation.

      def paintEvent(self, e)

      Appelée à chaque fois qu'il faut mettre à jour le dessin. C'est cette fonction qui va décrire au QPainter comment il doit peindre l'espace qui lui est attribué. Pareil qu'en dessus si tu ne comprends pas le contenu de la fonction => documentation.

      Je ne comprends pas ta fonction animate. J'imagine qu'elle doit animer le jeu, mais les noms de variables sont très mal choisis (rx c'est quoi? et bx? et vx? ^^).

      if __name__ == '__main__':
       
          import sys
       
          app = QApplication(sys.argv)
          mainWin = MainWindow()
          mainWin.show()
          sys.exit(app.exec_())

      La première ligne permet de ne rentrer dans le bloc de condition que si le programme est lancé par un utilisateur. Si le programme est lancé par un autre programme (par exemple avec un import dans un autre script Python) alors le contenu du bloc ne sera pas exécuté.

      La troisième ligne utilise les arguments passés au programme pour "lancer" le module cœur de Qt en mode GUI. Puis tu créés ta fenêtre principale à la quatrième ligne, et à la cinquième ligne tu l'affiches. Enfin la dernière ligne exécute la méthode exec_() qui va lancer le programme Qt. Lorsque cette fonction s'arrête elle va renvoyer un code (d'erreur ou pas en fonction de la raison de l'arrêt), et ce code d'erreur va être passé en paramètre de sys.exit, ce qui va permettre une sortie d'application un peu plus propre en cas d'erreur.

      Voila voila, si tu as besoin d'autres précisions que tu ne trouves pas dans la documentation, n'hésite pas à demander :)



      • Partager sur Facebook
      • Partager sur Twitter
        13 décembre 2015 à 13:02:53

        Je te remercie énormément pour ton aide et le temps que tu y a consacré! Je pense avoir tout compris :D

        Je te remercie également pour le lien sur la documentation de python! Je reposterai le jeu finis si jamais tu as envie de jouer a du pingpong ^^ 

        • Partager sur Facebook
        • Partager sur Twitter

        Graphique python

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown