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 :

Dédoublement menubar lors de l'update de la fenêtre


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Dédoublement menubar lors de l'update de la fenêtre
    Bonjour, je suis actuellement en train de créer une interface avec pyqt dans laquelle j'ai besoin de créer 2 modes : un mode simple et un mode avancé. Pour switcher entre les deux modes, j'ai choisi d'utiliser une QAction dans un menubar :
    Nom : menubar.png
Affichages : 98
Taille : 4,2 Ko
    Cette option peut être soit checké ou non ce qui à pour effet de changer le mode lors du click sur l'option. Mon problème vient lors de cette action. En effet dès que je clique, la fenêtre se recharge bien et l'interface change mais le menu se dédouble (comme on peut l’apercevoir sur le screenshot au dessus). Voici le code lié a la création de ma fenêtre et à la gestion du click :

    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
     
    class MainWindow(QMainWindow) : 
     
        def __init__(self) :
            super(MainWindow,self).__init__()
            self.modeSimple = True
            self.createWindow()
            self.show()
     
        def createWindow(self) :
            self.centralWidget = QWidget(self)
            self.menu = self.menuBar()
            self.setCentralWidget(self.centralWidget)
     
            self.opt = self.menu.addMenu("Options")
            self.opt.addAction("Préférences")
            self.mode = QAction("Mode simplifié",self,checkable = True)
            self.mode.setChecked(self.modeSimple)
            self.mode.triggered.connect(self.changeMode)
            self.opt.addAction(self.mode)
     
     
            self.labelDebut = QLabel("Date de début",self.centralWidget)
            self.dateEditDebut = QDateTimeEdit(self.centralWidget)
     
            self.labelFin = QLabel("Date de fin",self.centralWidget)
            self.dateEditFin = QDateTimeEdit(self.centralWidget)
     
            self.okButton = QPushButton("OK",self.centralWidget)
            self.okButton.clicked.connect(self.searchResult)
     
            [...]
     
            if not self.modeSimple : 
                #Cette partie du code fonctionne correctement
                self.comboPv = QComboBox()
                self.comboPv.addItems(constant.PV_LIST)
                self.secondHboxLayout = QHBoxLayout()
                self.secondHboxLayout.addWidget(self.comboPv)
                self.vboxLayout.addLayout(self.secondHboxLayout)
     
           [...]
     
        def changeMode(self,state):
            if state : 
                self.modeSimple = True
                self.createWindow()
                self.show()
            else :
                self.modeSimple = False
                self.createWindow()
                self.show()
    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    C'est normal puisqu'à chaque changement de la coche, tu AJOUTES un nouveau menu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.opt = self.menu.addMenu("Options")
    En fait, tout dépend si ton menu doit changer de structure ou pas entre tes 2 modes (simplifié ou non). Dans les 2 cas, il faut définir l'action de l'item à cocher avec self, pour qu'on puisse tester l'état de sa coche plus tard:

    1- si ton menu ne change pas, à chaque activation de l'item à cocher, sa méthode sera appelée, et l'état de la coche pourra être testé. Petit exemple simple à exécuter chez toi:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 3
     
    import sys
     
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QMainWindow):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
            self.resize(600, 400)
            self.initmenu()
     
        #========================================================================
        def initmenu(self):
     
            #--------------------------------------------------------------------
            menu1 = QtWidgets.QMenu("menu1", self)
     
            action1 = QtWidgets.QAction('item1', self)
            action1.triggered.connect(self.meth_action1)
            menu1.addAction(action1)
     
            menu1.addSeparator()
     
            self.action2 = QtWidgets.QAction('item2', self)
            self.action2.setCheckable(True)
            self.action2.setChecked(True)
            self.action2.triggered.connect(self.meth_action2)
            menu1.addAction(self.action2)
     
            menu1.addSeparator()
     
            action3 = QtWidgets.QAction('item3', self)
            action3.triggered.connect(self.meth_action3)
            menu1.addAction(action3)
     
            self.menuBar().addMenu(menu1)
     
            #--------------------------------------------------------------------
            menu2 = QtWidgets.QMenu("menu2", self)
     
            action4 = QtWidgets.QAction('item1', self)
            action4.triggered.connect(self.meth_action4)
            menu2.addAction(action4)
     
            self.menuBar().addMenu(menu2)
     
        #========================================================================
        def meth_action1(self):
            """méthode lancée par l'item1 du menu1
            """
            print("item1 du menu1")
     
        #========================================================================
        def meth_action2(self):
            """méthode lancée par l'item2 du menu1
            """
            if self.action2.isChecked():
                print("item2 du menu1 coché => mettre le mode 1")
            else:
                print("item2 du menu1 non coché => mettre le mode 2")
     
        #========================================================================
        def meth_action3(self):
            """méthode lancée par l'item3 du menu1
            """
            print("item3 du menu1")
     
        #========================================================================
        def meth_action4(self):
            """méthode lancée par l'item1 du menu2
            """
            print("item1 du menu2")
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    2- Si par contre le menu change entre les 2 modes (simplifié ou non), il faut en plus supprimer et reconstruire le menu:
    => mémoriser l'état de la coche
    => supprimer l'ancien menu avec self.menuBar().clear()
    => rappeler la méthode qui pourra reconstruire le bon menu en fonction de l'état de la coche mémorisée.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Dans ce cas la je ne comprends pas pourquoi je n'ai pas le même problème pour les autres éléments de ma fenêtre que j'ajoute a chaque fois que je change de mode.

    Merci pour la solution, du coup j'utilise la deuxième solution proposé bien que je n'ai pas à le modifier.

    Je n'ai donc plus de problème mais j'aimerais cependant comprendre pourquoi lorsque je recrée ma fenêtre seul le menu se dédouble et pas les autres éléments. Voici l'ensemble de ma méthode CreateWindow si cela peut aider.
    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
    def createWindow(self) :
            self.centralWidget = QWidget(self)
            self.menu = self.menuBar()
            self.setCentralWidget(self.centralWidget)
     
            self.opt = self.menu.addMenu("Options")
            self.opt.addAction("Préférences")
            self.mode = QAction("Mode simplifié",self,checkable = True)
            self.mode.setChecked(self.modeSimple)
            self.mode.triggered.connect(self.changeMode)
            self.opt.addAction(self.mode)
     
     
            self.labelDebut = QLabel("Date de début",self.centralWidget)
            self.dateEditDebut = QDateTimeEdit(self.centralWidget)
     
            self.labelFin = QLabel("Date de fin",self.centralWidget)
            self.dateEditFin = QDateTimeEdit(self.centralWidget)
     
            self.okButton = QPushButton("OK",self.centralWidget)
            self.okButton.clicked.connect(self.searchResult)
     
            self.errorText = QLabel("",self.centralWidget)
            self.errorText.setAlignment(Qt.AlignCenter)
     
            self.plot = PlotCanvas(self,width=5, height=4,dpi=100)
            self.plot.move(0,0)
     
            self.labelResult = QLabel("Resultat : ",self.centralWidget)
     
     
            self.hboxLayout = QHBoxLayout()
     
            self.hboxLayout.addWidget(self.labelDebut)
            self.hboxLayout.addWidget(self.dateEditDebut)
            self.hboxLayout.addWidget(self.labelFin)
            self.hboxLayout.addWidget(self.dateEditFin)
            self.hboxLayout.addWidget(self.okButton)
     
            self.innerHboxLayout = QHBoxLayout()
            self.innerHboxLayout.addWidget(self.plot)
     
            self.vboxLayout = QVBoxLayout(self.centralWidget)
            self.vboxLayout.addLayout(self.hboxLayout)
     
            if not self.modeSimple : 
                self.comboPv = QComboBox()
                self.comboPv.addItems(constant.PV_LIST)
                self.labelCut = QLabel("Cut")
                self.cutEdit = QLineEdit()
                self.secondHboxLayout = QHBoxLayout()
                self.secondHboxLayout.addWidget(self.comboPv)
                self.secondHboxLayout.addWidget(self.labelCut)
                self.secondHboxLayout.addWidget(self.cutEdit)
                self.vboxLayout.addLayout(self.secondHboxLayout)
     
            self.vboxLayout.addWidget(self.errorText)
            self.vboxLayout.addLayout(self.innerHboxLayout)
            self.vboxLayout.addWidget(self.labelResult)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Hedwin Voir le message
    pourquoi lorsque je recrée ma fenêtre seul le menu se dédouble et pas les autres éléments.
    Techniquement, ce que vous appelez fenêtre correspond au QMainWindow.
    Vous changez son contenu sans la détruire (sans la recréer dans un état initial).
    Et le "menu" est quelque chose d'associé à cette fenêtre: .menu.addMenu va ajouter au menu existant.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparer deux enregistrements mysql lors d'un update ?
    Par zevince dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 16h56
  2. Erreur lors d'un Update en SQlserver
    Par kedig dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 30/08/2005, 08h22
  3. deadlock lors d'un update
    Par jacques trepp dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/06/2005, 16h46
  4. [ACCESS] [JET] [ADO] Erreur 3000 lors d'un update
    Par Benjamin GAGNEUX dans le forum Bases de données
    Réponses: 5
    Dernier message: 26/08/2004, 21h16
  5. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37

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