Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

PyQt & PySide

Choisissez la catégorie, puis la rubrique :

FAQ Qt FAQ Qt Creator FAQ PyQt & PySide
logo
Sommaire > QtGui > Animation
        Comment animer un widget ?





Comment animer un widget ?
auteur : Jiyuu
Afin d'animer un widget on utilise la classe QPropertyAnimation, qui anime les propriétés des objets Qt.
QPropertyAnimation permet de modifier la valeur de la propriété d'un widget telle que sa position et/ou sa taille.
QPropertyAnimation permet d'animer de nombreux widgets Qt et, donc, PySide.
# -*- coding: iso-8859-1 -*-
 
import sys
from PySide import QtGui, QtCore
 
## Création de la fenêtre principale.
class Frame(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(600,500)
 
        self.button = QtGui.QPushButton ("Hello", self)
        ## Création de l'objet self.animate issu de QPropertyAnimation.
        ## Nous passons en argument le widget qui sera à animer et la propriété que nous allons animer
        self.animate = QtCore.QPropertyAnimation(self.button, "geometry")
        ## Nous rentrons le délai de l'animation en ms
        self.animate.setDuration(800)
        ## Nous indiquons les propriétés de départ
        self.animate.setStartValue(QtCore.QRect(0, 0, 100, 30))
        ## Puis les propriétés de fin
        self.animate.setEndValue(QtCore.QRect(250, 250, 300, 30))
        ## Et enfin nous démarrons l'animation
        self.animate.start()
       
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())
Le code ci dessous permet de voir d'autres animations possibles, comme QtCore.QPropertyAnimation(widget, "pos") ou QtCore.QPropertyAnimation(self.label, "size"). Nous montrons aussi qu'il est possible de faire des transitions grâce à setKeyValueAt(a, QtCore.QPoint(int, int)), où a est compris entre 0 et 1, 1 représentant le temps total de l'animation (donc 0.5 le milieu).

Pour finir, il est possible de faire défiler l'animation un certain nombre de fois grâce à setLoopCount(int). Si la valeur passée est -1, alors l'animation tourne toujours en boucle. La valeur par défaut est 1. Si on met 2, la boucle se jouera 2 fois et ainsi de suite. Notez que 0 permet de ne pas lancer l'animation.
# -*- coding: iso-8859-1 -*-
 
import sys
from PySide import QtGui, QtCore
import random
 
## Création de la fenêtre principale.
class Frame(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.resize(500,590)
 
        label = QtGui.QLabel("", self)
        label.move(0, 0)
        label.setPixmap(QtGui.QPixmap("qt-logo.png"))
 
 
        def neige(n,m):
            numero = str(n)+'_'+str(m)
            globals()["self.label"+numero] = QtGui.QLabel("<font color='white'>*</font>", self)
            globals()["self.label"+numero].setFont(QtGui.QFont("fantasy", 20, QtGui.QFont.Black))
            globals()["self.label"+numero].move(n,m)
 
            if (n+m)%2 == 0:
                globals()["self.animate"+numero] = QtCore.QPropertyAnimation(globals()["self.label"+numero], "size")
                globals()["self.animate"+numero].setDuration(1000)
                globals()["self.animate"+numero].setStartValue(QtCore.QSize(0, 0))
                globals()["self.animate"+numero].setEndValue(QtCore.QSize(40, 40))
                globals()["self.animate"+numero].setLoopCount(-1)
                globals()["self.animate"+numero].start()
 
 
        def cre():
            for n in range (35):
                for i in range (15):
                    neige(i*60,n*15)
                    neige(i*60+30,n*60+20)
 
        cre()
 
 
        self.label = QtGui.QPushButton ("Bonnes Fêtes\nde fin d'Année", self)
        self.label.setFont(QtGui.QFont("fantasy", 40, QtGui.QFont.Bold))
        self.label.resize(400,120)
 
 
        self.animate = QtCore.QPropertyAnimation(self.label, "pos")
        self.animate.setDuration(60000)
        self.animate.setStartValue(QtCore.QPoint(0, 0))
        a = 0
        while a < 50:
            x_ = random.randrange(0,101,50)
            y_ = random.randrange(0,471,50)
            self.animate.setKeyValueAt(0.02*a, QtCore.QPoint(int(x_), int(y_)))
            a = a+1
        self.animate.setEndValue(QtCore.QPoint(0, 0))
        self.animate.setEasingCurve(QtCore.QEasingCurve.Linear)
 
        self.animate.setLoopCount(-1)
        self.animate.start()
 
 
 
 
app = QtGui.QApplication(sys.argv)
frame = Frame()
frame.show()
sys.exit(app.exec_())

Copyright © 2010 developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique PyQt & PySide

Partenaire : Hébergement Web