IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Animation et menu


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut Animation et menu


    J'essaie désespérément de créer un menu qui s'adapte qui effectue une animation
    Au clic sur le premier niveau (exemple A) il lance l'animation closeMenu et openMenu avec un nouveau Menu
    Au clic sur le deuxième niveau (exemple A.a) il lance l'animation (pas encore crée mais l'esprit est là ^^) open mainFrame

    Nom : test.jpg
Affichages : 771
Taille : 13,5 Ko

    Ce que je n'arrive pas à faire :
    - créer une animation tel que chaque boutons se cachent (ou apparaissent) de manière décalés
    - changer le menu (passer de A à A.a et revenir à A si je clic sur back)

    de l'aide serait bienvenu ^^

    merci d'avance !

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    # -*- coding: utf-8 -*-
     
    from PyQt4 import QtCore, QtGui
    from functools import partial
    import sys
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    def MainMenu(text):
        if text == 'A':
            menu = ['back', 'A.a', 'A.b', 'A.c']
        elif text == 'B':
            menu = ['back', 'B.a', 'B.b']
        elif text == 'C':
            menu = ['back', 'C.a', 'C.b', 'C.c', 'C.d']
        else:
            menu = ['A', 'B', 'C']
        return menu
     
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName(_fromUtf8("form"))
            Form.resize(760, 552)
            Form.setAutoFillBackground(False)
     
            self.menuFrame = QtGui.QFrame(Form)
            self.menuFrame.setGeometry(QtCore.QRect(0, 0, 161, 2000))
            self.menuFrame.setFrameShape(QtGui.QFrame.StyledPanel)
            self.menuFrame.setFrameShadow(QtGui.QFrame.Raised)
            self.menuFrame.setObjectName(_fromUtf8("menuFrame"))
     
            self.mainFrame = QtGui.QFrame(Form)
            self.mainFrame.setGeometry(QtCore.QRect(180, 20, 1700, 2000))
            self.mainFrame.setFrameShape(QtGui.QFrame.StyledPanel)
            self.mainFrame.setFrameShadow(QtGui.QFrame.Raised)
            self.mainFrame.setObjectName(_fromUtf8("mainFrame"))
     
            self = InitMenu(self.menuFrame, MainMenu(''))
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            pass
     
    class InitMenu(object):
        height = 20
        pos = 50
        marg = 2
        xWidth = 143
     
        def __init__(self, frame, menuList):
            self.menuList = menuList
            if not not self.menuList:
                self.btn = []
                newPos = self.pos
                for i in range(len(menuList)):
                    self.btn.append( ButtonMenu(newPos, self.height, menuList[i], self.xWidth, frame) )
                    newPos = newPos + self.height + self.marg
            self.openMenu(frame)
     
        def openMenu(self, frame):
            newPos = self.pos
            for i in range(len(self.btn)):
    			self.btn[i].showButton(newPos, self.height, self.xWidth)
    			newPos = newPos + self.height + self.marg
     
        def closeMenu(self, frame):
            newPos = self.pos
            for i in range(len(self.btn)):
    			self.btn[i].closeButton(newPos, self.height, self.xWidth)
    			newPos = newPos + self.height + self.marg
     
        def retranslateUi(self, Form):
            pass
     
    class ButtonMenu(QtGui.QPushButton):
     
        def __init__(self, pos, height, text, xWidth, obj):
            super(ButtonMenu, self).__init__(text, obj)
     
            self.string = text
            self.setGeometry(QtCore.QRect(5 - xWidth, pos, xWidth, height))
            self.setObjectName(_fromUtf8(text))
            self.clicked.connect(partial( DoStuff, text ))
     
        def showButton(self, pos, height, xWidth):
            self.animate = QtCore.QPropertyAnimation(self, "geometry")
            self.animate.setDuration(400)
            self.animate.setStartValue(QtCore.QRect( - xWidth, pos, xWidth, height))
            self.animate.setEndValue(QtCore.QRect(5, pos, xWidth, height))
            self.animate.start()
     
        def closeButton(self, pos, height, xWidth):
            self.animate = QtCore.QPropertyAnimation(self, "geometry")
            self.animate.setDuration(400)
            self.animate.setStartValue(QtCore.QRect(5, pos, xWidth, height))
            self.animate.setEndValue(QtCore.QRect( - xWidth, pos, xWidth, height))
            self.animate.start()
     
    def DoStuff(printStr):
        print(printStr)
     
    class Gui(QtGui.QDialog, Ui_Form):
     
        def __init__(self, parent = None):
            super(Gui, self).__init__(parent)
            self.setupUi(self)
     
        def main(self):
            self.show()
     
    if __name__ == '__main__':
     
        app = QtGui.QApplication(sys.argv)
        useGui = Gui()
        useGui.main()
        sys.exit(app.exec_())

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Personne n'a répondu, mais peut-être que le problème n'existe plus après 4 jours.

    En tout cas, le système de menu de PyQt permet d'avoir des menus arborescents, avec les sous-menus (et les sous-sous-menu, etc...) décalés par rapport aux menus parents.

    Il y a d'ailleurs un exemple de menus dans les qtdemo, et donc de code Python qui fait ça.

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut Hélas
    Bonsoir tyrtamos,

    Hélas non je bute toujours dessus en chinant sur le web (mon faible niveau n'aide pas non plus ^^)

    C'est exactement ce menu que je souhaite faire
    Nom : Capture.PNG
Affichages : 800
Taille : 186,2 Ko

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Moi je dirais un layout horizontal avec un QWidget à gauche et un QPlainTextEdit à droite. Dans le Qwidget, un layout vertical avec une douzaine de QPushButton terminés par deux QPushbutton dans un layout horizontal.

    Le tout emballé dans un layout grille sur le widget central et l'affaire est pliée.

    Je te réitère le conseil de Tyrtamos, regarde les codes des démos, ce que tu as besoin y est déjà écrit.

  5. #5
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Moi je dirais un layout horizontal avec un QWidget à gauche et un QPlainTextEdit à droite. Dans le Qwidget, un layout vertical avec une douzaine de QPushButton terminés par deux QPushbutton dans un layout horizontal.

    Le tout emballé dans un layout grille sur le widget central et l'affaire est pliée.

    Je te réitère le conseil de Tyrtamos, regarde les codes des démos, ce que tu as besoin y est déjà écrit.
    Oui effectivement, merci VinsS

    Mais je suis surtout focalisé sur le fait que lorsque l'on clic sur le menu une animation fait disparaître les boutons et en fait apparaître de nouveaux et en même temps fait apparaître (toujours avec une animation) une frame par la droite

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Et bien tout qtdemo, y compris ce menu, est codé en Python! Il ne reste plus qu'à chercher comment.

    Je suggère de recopier le répertoire examples quelque part. En mettant des print et en coupant ici et là, essaie de trouver à quel endroit le menu est dessiné.

  7. #7
    Membre habitué
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Et bien tout qtdemo, y compris ce menu, est codé en Python! Il ne reste plus qu'à chercher comment.

    Je suggère de recopier le répertoire examples quelque part. En mettant des print et en coupant ici et là, essaie de trouver à quel endroit le menu est dessiné.
    Bien vu pas encore trouvé, mais bien vu !

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Un exemple:
    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
     
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt4 import QtGui, QtCore
     
    class ButtonsWidget(QtGui.QWidget):
        def __init__(self, parent=None):
            super(ButtonsWidget, self).__init__(parent)
            self.resize(154, 493)
            self.gridLayout = QtGui.QGridLayout(self)
            self.verticalLayout = QtGui.QVBoxLayout()
            self.start_btn = QtGui.QPushButton("Click me", self)
            self.start_btn.setMinimumSize(QtCore.QSize(0, 28))
            self.start_btn.setMaximumSize(QtCore.QSize(16777215, 28))
            self.verticalLayout.addWidget(self.start_btn)
            spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, 
                                            QtGui.QSizePolicy.Expanding)
            self.verticalLayout.addItem(spacerItem)
            self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
            self.start_btn.clicked.connect(self.on_start_clicked)
            self.buttons = []
     
        def on_start_clicked(self):
            def run():
                if self.idx == 7:
                    return
                self.idx += 1
                btn = QtGui.QPushButton(texts[self.idx], self)
                btn.setGeometry(QtCore.QRect(start_x, start_y, width, 28))
                btn.setMinimumSize(QtCore.QSize(0, 28))
                btn.setMaximumSize(QtCore.QSize(16777215, 28))
                self.anim = QtCore.QPropertyAnimation(btn, "geometry")
                self.anim.setDuration(200+self.idx*50)
                end_y = start_y + self.idx * 32
                self.anim.setEndValue(QtCore.QRect(start_x, end_y, width, 28))
                self.anim.finished.connect(run)
                btn.show()
                self.anim.start()
                self.buttons.append(btn)
     
            self.idx = -1
            texts = ["Option 1", "Option 2", "Option 3", "Option 4", 
                      "Option 5", "Option 6", "Option 7", "Option 8"]
            start_x, start_y =  self.start_btn.pos().x(), self.start_btn.pos().y()
            width = self.start_btn.width()
     
            run()
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        bw = ButtonsWidget()
        bw.show()
        sys.exit(app.exec_())
    On peut aussi appliquer des effets de mouvements non-uniformes, regarde les exemples easing

    Après, il faudra boucler sur la liste de boutons pour les connecter et, éventuellement, les placer dans le layout pour que cela soit redimensionnable proprement. Ce qui n'est pas le cas ici.

Discussions similaires

  1. fonction animate pour menu deroulant
    Par willyg28 dans le forum jQuery
    Réponses: 4
    Dernier message: 11/04/2012, 09h09
  2. Sous-menu et animation flash
    Par kcin dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 24/07/2007, 11h34
  3. Menu animé : problème d'agencement
    Par OCRom dans le forum Flash
    Réponses: 3
    Dernier message: 13/06/2007, 09h36
  4. Animation sous un menu
    Par Galaad dans le forum Flash
    Réponses: 6
    Dernier message: 14/09/2006, 19h37
  5. menu déroulant masqué par animation flash
    Par matperino dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/12/2005, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo