Bonjour,

Je développe actuellement une interface graphique sous pyqt où j'essaie de lancer une animation en appuyant sur un bouton. L'animation en question représente une main qui doit se déplacer et attraper un objet aléatoirement pour le déplacer à son tour. Je dispose des images de la main dans ses différents états (ouverte, semi-ouverte..) et des objets à déplacer.
J'utilise une QGraphicsItemAnimation(), où je fais un setItem() avec une première image de la main, mon code fait bien translater la main jusqu’à l'un des objets, ce qui me pose problème depuis un moment maintenant est que je n'arrive pas à changer d'images pour la main, en effet je voudrais selon la distance par rapport à l'objet à atteindre, changer d'image en faisant d'autres setItem() afin de créer ce mouvement d'aller attraper un objet, mais je pense que je m'y prend mal car on dirait que la méthode setItem() ne peut être appelée qu'une seule fois pour l'animation, mais du coup cela voudrait-il dire qu'on ne peut avoir qu'un seul objet qui effectue un mouvement? A la base, j'aurais voulu utiliser une classe plus "adaptée" comme pour les 'sprites animations' que je ne retrouve pas sous pyqt.

Merci d'avance pour votre aide, je suis désespérée
voici mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
from PyQt4.QtGui import QMainWindow
from PyQt4 import QtGui, QtCore, uic
import random
import sys
 
 
class MyView(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
 
        #j'ai crée auparavant une fenêtre avec QtDesigner dans laquelle je dispose d'une QGraphicsView, ici je load cette fenêtre
        uic.loadUi('fenetreAnimation.ui', self)
 
        self.graphicsView.scene = QtGui.QGraphicsScene(self)
 
        #images reprèsente toute les images de la main (ouverte, semi-ouverte,fermée)
        self.images = [QtGui.QPixmap("main1.png"), QtGui.QPixmap("main2.png"), QtGui.QPixmap("main3.png"),
                       QtGui.QPixmap("main4.png"), QtGui.QPixmap("main5.png"), QtGui.QPixmap("main6.png")]
        #je rajoute à ma scène les objets a déplacer une banane et un cheval
        self.graphicsView.item = QtGui.QGraphicsPixmapItem(QtGui.QPixmap("banane.gif"), None, self.graphicsView.scene)
        self.graphicsView.item2 = QtGui.QGraphicsPixmapItem(QtGui.QPixmap("cheval.gif"), None, self.graphicsView.scene)
        self.graphicsView.item2.setPos(-700, 0)
        self.graphicsView.item.setPos(-900, 0)
 
        #le bouton parler permet de lancer l'animation
        self.pushButton_3.clicked.connect(self.play)
 
        self.graphicsView.setScene(self.graphicsView.scene)
 
 
    #code du bouton parler
    def play(self):
        self.tl = QtCore.QTimeLine(3000)
        self.tl.setFrameRange(0, 2000)
 
        self.a = QtGui.QGraphicsItemAnimation()
        self.a.setItem(self.graphicsView.item)
        self.a.setTimeLine(self.tl)
        self.a.setPosAt(0, QtCore.QPointF(-900, 0))
 
 
        self.a2 = QtGui.QGraphicsItemAnimation()
 
        self.a2.setTimeLine(self.tl)
 
        #le setItem qui permet d'avoir la première image de la main
        self.a2.setItem(QtGui.QGraphicsPixmapItem(self.images[0], None, self.graphicsView.scene))
 
 
        # probabilité 1/3
 
        u = random.randint(1, 3)
        if u == 2:
            for i in range(0, 800):
                #cette boucle permet a la main de se translater 
                self.a2.setPosAt(abs(i) / 800, QtCore.QPointF(-i, -80))
                print("cheval")
                #if self.a2.posAt(0.9999):
                    #self.a2.setItem(QtGui.QGraphicsPixmapItem(self.images[3], None, self.graphicsView.scene))
 
 
 
                    # print(self.a2.posList())
        else:
            for i in range(0, 900):
                self.a2.setPosAt(abs(i) / 900, QtCore.QPointF(-i, -80))
                print("banane")
               # if self.a2.posAt(0.9999):
                    #self.a2.setItem(QtGui.QGraphicsPixmapItem(self.images[3], None, self.graphicsView.scene))
 
 
        self.tl.start()
 
 
 
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = MyView()
    view.setFixedSize(1300, 1000)
    view.show()
    sys.exit(app.exec_())
Cela donne lieu à cette animation :

Nom : mouvement.png
Affichages : 359
Taille : 211,2 Ko