Aide erreur d'ouverture d'une page dans programme python.

Bonjour à tous, 

Il y a t-il un programmeur qui peut me venir en aide svp ? 

j'ai des erreurs d'ouverture de page sur un programme que j'ai créé avec python et QT designer. 

Pour un échange par mail si possible pour envoi des fichier .ui et .py. 

***@***

Merci pour votre retour 

Rémi 

13 réponses

  1. Voici mon code .py 

    Merci

    from PyQt5.QtWidgets import *
    from PyQt5.uic import loadUi
    from PyQt5.QtWidgets import QListWidgetItem
    from PyQt5.QtGui import QPixmap
    
    class Joueur:
        def __init__(self,nom,prenom,age,taille,poids,poste,numero,etat):
            self.nom = nom
            self.prenom = prenom
            self.age = age
            self.taille = taille
            self.poids = poids
            self.poste = poste
            self.numero = numero
            self.etat = etat
            
    class IHM_Ajout(QDialog):
        def __init__(self,Effectif):
            super().__init__()
            loadUi('ajout_joueur.ui', self)
            self.Effectif = Effectif  
            self.btnAjouter.clicked.connect(self.ajouterJoueur)
            self.btnCancel.clicked.connect(self.annulerAjout)
    
        def ajouterJoueur(self):
            nom = self.edtNom.text()
            prenom = self.edtPrenom.text()
            age = int(self.edtAge.text())
            taille = float(self.edtTaille.text())
            poids = float(self.edtPoids.text())
            poste = self.edtPoste.text()
            numero = int(self.edtNumero.text())
            etat = self.edtEtat.text()
            nouveauJoueur = Joueur(nom, prenom, age, taille, poids, poste, numero, etat)
            self.Effectif.append(nouveauJoueur)
    
            self.accept()
    
        def annulerAjout(self):
            self.reject()
            
    class IHM_Modifier(QDialog):
        def __init__(self,Effectif, joueur):
            super().__init__()
            loadUi('modif_joueur.ui', self)
            self.Effectif = Effectif
            self.joueur = joueur
            self.initChamps()
            self.btnModifier.clicked.connect(self.modifierJoueur)
            
        def initChamps(self):
            self.edtNom.setText(self.joueur.nom)  
            self.edtPrenom.setText(self.joueur.prenom) 
            self.edtAge.setText(str(self.joueur.age))
            self.edtTaille.setText(str(self.joueur.taille))
            self.edtPoids.setText(str(self.joueur.poids))
            self.edtPoste.setText(self.joueur.poste)
            self.edtNumero.setText(str(self.joueur.numero))
            self.edtEtat.setText(self.joueur.etat)    
            
        def modifierJoueur(self):
            self.joueur.nom = self.edtNom.text()
            self.joueur.prenom = self.edtPrenom.text()
            self.joueur.age = self.edtAge.text()
            self.joueur.taille = self.edtTaille.text()
            self.joueur.poids = self.edtPoids.text()
            self.joueur.poste = self.edtPoste.text()
            self.joueur.numero = self.edtNumero.text()
            self.joueur.etat = self.edtEtat.text()
            self.accept()
            
    
    class IHM_equipe_foot(QWidget):
        def __init__(self):
            super().__init__()
            loadUi ('IHM_equipe_foot.ui', self)
            self.btnSupprimer.clicked.connect(self.Supprimer)
            self.btnModifier.clicked.connect(self.AfficherpageModifier)
            self.btnAjouter.clicked.connect(self.AfficherpageAjout)
            self.btnSuivant.clicked.connect(self.Suivant)
            self.btnPrecedent.clicked.connect(self.Precedent)
            self.Effectif = []
            self.Effectif.append(Joueur('Guilhauma','Rémi',29,170,85,'Attaquant droit',11 ,'Titulaire'))
            self.Effectif.append(Joueur('Cobo','Rudy',27,173,80,'Milieu défensif',6 ,'Titulaire'))
            self.Effectif.append(Joueur('Bouffenie','Romain',39,185,87,'Milieu droit',8 ,'Titulaire'))
            self.Effectif.append(Joueur('Damourette', 'Thibault', 31, 175,73, 'Défenseur droit',2 , 'Titulaire'))
            self.Effectif.append(Joueur('Harati', 'Khadija',33 , 165, 60, 'Milieu gauche', 7 , 'Titulaire'))
            self.Effectif.append(Joueur('Stein', 'Nicolas', 39, 183, 102, 'Gardien', 1 , 'Titulaire'))
            self.Effectif.append(Joueur('Zidane', 'Zinédine', 51, 185, 78, 'Milieu offensif', 10 , 'Titulaire'))
            self.Effectif.append(Joueur('Giuly', 'Ludovic', 46, 164, 62, 'Défenseur gauche', 3 , 'Titulaire'))
            self.Effectif.append(Joueur('Mbappé', 'Killian', 24, 178, 75, 'Attaquant gauche', 9 , 'Titulaire'))
            self.Effectif.append(Joueur('Varane', 'Raphael', 30, 191, 81, 'Défenseur centrale', 4 , 'Titulaire'))
            self.Effectif.append(Joueur('Ramos', 'Sergio', 37, 184, 82, 'Défenseur centrale', 5 , 'Titulaire'))
            self.Effectif = sorted(self.Effectif, key=lambda joueur: joueur.numero)
            for joueur in self.Effectif:
                item = QListWidgetItem(f"{joueur.numero}. {joueur.nom} {joueur.prenom}")
                self.listWidget.addItem(item)
            self.listWidget.itemClicked.connect(self.afficherJoueurDetails)
            self.indiceListe = 0
            self.afficherJoueur()  
    
        def afficherJoueur(self):
            joueur = self.Effectif[self.indiceListe]  
            self.afNom.setText(joueur.nom)
            self.afPrenom.setText(joueur.prenom)  
            self.afAge.setText(str(joueur.age))
            self.afTaille.setText(str(joueur.taille))
            self.afPoids.setText(str(joueur.poids))
            self.afPoste.setText(joueur.poste)
            self.afNumero.setText(str(joueur.numero))
            self.afEtat.setText(joueur.etat)
    
    
        def Precedent(self):
            self.indiceListe -= 1
            if self.indiceListe < 0:
                self.indiceListe = 0
            self.afficherJoueur()
    
        def Suivant(self):
            self.indiceListe += 1
            if self.indiceListe == len(self.Effectif):
                self.indiceListe = len(self.Effectif) - 1
            self.afficherJoueur()
    
        def Supprimer(self):
            del self.Effectif[self.indiceListe]
            self.listWidget.takeItem(self.indiceListe)
            if self.indiceListe == len(self.Effectif):  
                self.indiceListe -= 1
            self.afficherJoueur()
            
        def afficherJoueurDetails(self, item):
            joueur_index = self.listWidget.row(item)
            joueur = self.Effectif[joueur_index]
            self.afNom.setText(joueur.nom)
            self.afPrenom.setText(joueur.prenom)
            self.afAge.setText(str(joueur.age))
            self.afTaille.setText(str(joueur.taille))
            self.afPoids.setText(str(joueur.poids))
            self.afPoste.setText(joueur.poste)
            self.afNumero.setText(str(joueur.numero))
            self.afEtat.setText(joueur.etat)
            self.currentJoueurIndex = joueur_index
            
        def AfficherpageModifier(self):
            joueur_index = self.currentJoueurIndex
            ihm = IHM_Modifier(self.Effectif, self.Effectif[self.currentJoueurIndex])
            ihm.joueur = self.Effectif[joueur_index]
            self.Effectif[joueur_index] = joueur
            if ihm.exec_() == QDialog.Accepted:
                self.Effectif = sorted(self.Effectif, key=lambda joueur: joueur.numero)
                self.afficherJoueur()
                
        def AfficherpageAjout(self):
            ihm = IHM_Ajout(self.Effectif)  
            ihm.exec()  
            self.afficherJoueur()  
            
    app = QApplication([])
    ihm = IHM_equipe_foot()
    ihm.show()
    app.exec_()
    1. Salut,

      Difficile de comprendre ce qui ne va pas sans les fichiers .ui

      Idéalement, ce serait de compresser ton projet, d'utiliser un site de transfert et de mettre le lien de téléchargement.

    2. @Diablo76

      Bonjour, 

      Désole je n'avais pas vu que vous aviez répondu.

      Oui je me doutais de ça.. ci-dessous le lien de téléchargement du dossier avec tous les fichiers du projet. 

      https://wetransfer.com/downloads/2d72ac7450b1751107c0fa8fd8ef9abe20230703072938/a87225

      Merci encore :)

      Rémi 

  2. Salut,

    Alors oui, beaucoup de choses ne vont pas, tu appelles des objets qui n'existent pas dans tes fichiers UI.

    Ce qui m'a le plus gêné, c'est sur l'interface principale, la gestion des items avec les boutons précédent - suivant - supprimer, rien n'est pris en compte, la suppression se fait depuis le début de ta liste d'items et non depuis l'item sélectionné.

    Ce n'est qu'un premier jet :

    from PyQt5.QtWidgets import *
    from PyQt5.uic import loadUi
    from PyQt5.QtWidgets import QListWidgetItem
    from PyQt5.QtGui import QPixmap
    
    class Joueur:
        def __init__(self,nom,prenom,age,taille,poids,poste,numero,etat):
            self.nom = nom
            self.prenom = prenom
            self.age = age
            self.taille = taille
            self.poids = poids
            self.poste = poste
            self.numero = numero
            self.etat = etat
            
    class IHM_Ajout(QDialog):
        def __init__(self,Effectif):
            super().__init__()
            loadUi('ajout_joueur.ui', self)
            self.Effectif = Effectif  
            #self.btnAjouter.clicked.connect(self.ajouterJoueur)
            self.btnCancel.clicked.connect(self.annulerAjout)
    
        def ajouterJoueur(self):
            nom = self.edtNom.text()
            prenom = self.edtPrenom.text()
            age = int(self.edtAge.text())
            taille = float(self.edtTaille.text())
            poids = float(self.edtPoids.text())
            poste = self.edtPoste.currentText()
            numero = int(self.edtNumero.currentText())
            etat = self.edtEtat.currentText()
            nouveauJoueur = Joueur(nom, prenom, age, taille, poids, poste, numero, etat)
            self.Effectif.append(nouveauJoueur)
    
            self.accept()
    
        def annulerAjout(self):
            self.reject()
            
    class IHM_Modifier(QDialog):
        def __init__(self,Effectif, joueur):
            super().__init__()
            loadUi('modif_joueur.ui', self)
            self.Effectif = Effectif
            self.joueur = joueur
            self.initChamps()
            #self.btnModifier.clicked.connect(self.modifierJoueur)
            
        def initChamps(self):
            self.edtNom.setText(self.joueur.nom)  
            self.edtPrenom.setText(self.joueur.prenom) 
            self.edtAge.setText(str(self.joueur.age))
            self.edtTaille.setText(str(self.joueur.taille))
            self.edtPoids.setText(str(self.joueur.poids))
            self.edtPoste.setCurrentText(self.joueur.poste)
            self.edtNumero.setCurrentText( str(self.joueur.numero))
            self.edtEtat.setCurrentText(self.joueur.etat)
            
        def modifierJoueur(self):
            self.joueur.nom = self.edtNom.text()
            self.joueur.prenom = self.edtPrenom.text()
            self.joueur.age = self.edtAge.text()
            self.joueur.taille = self.edtTaille.text()
            self.joueur.poids = self.edtPoids.text()
            self.joueur.poste = self.edtPoste.currentText()
            self.joueur.numero = int(self.edtNumero.currentText())
            self.joueur.etat = self.edtEtat.currentText()
            self.accept()
            
    
    class IHM_equipe_foot(QWidget):
        def __init__(self):
            super().__init__()
            loadUi ('IHM_equipe_foot.ui', self)
            self.btnSupprimer.clicked.connect(self.Supprimer)
            self.btnModifier.clicked.connect(self.AfficherpageModifier)
            self.btnAjouter.clicked.connect(self.AfficherpageAjout)
            self.btnSuivant.clicked.connect(self.Suivant)
            self.btnPrecedent.clicked.connect(self.Precedent)
            self.Effectif = []
            self.Effectif.append(Joueur('Guilhauma','Rémi',29,170,85,'Attaquant droit',11 ,'Titulaire'))
            self.Effectif.append(Joueur('Cobo','Rudy',27,173,80,'Milieu défensif',6 ,'Titulaire'))
            self.Effectif.append(Joueur('Bouffenie','Romain',39,185,87,'Milieu droit',8 ,'Titulaire'))
            self.Effectif.append(Joueur('Damourette', 'Thibault', 31, 175,73, 'Défenseur droit',2 , 'Titulaire'))
            self.Effectif.append(Joueur('Harati', 'Khadija',33 , 165, 60, 'Milieu gauche', 7 , 'Titulaire'))
            self.Effectif.append(Joueur('Stein', 'Nicolas', 39, 183, 102, 'Gardien', 1 , 'Titulaire'))
            self.Effectif.append(Joueur('Zidane', 'Zinédine', 51, 185, 78, 'Milieu offensif', 10 , 'Titulaire'))
            self.Effectif.append(Joueur('Giuly', 'Ludovic', 46, 164, 62, 'Défenseur gauche', 3 , 'Titulaire'))
            self.Effectif.append(Joueur('Mbappé', 'Killian', 24, 178, 75, 'Attaquant gauche', 9 , 'Titulaire'))
            self.Effectif.append(Joueur('Varane', 'Raphael', 30, 191, 81, 'Défenseur centrale', 4 , 'Titulaire'))
            self.Effectif.append(Joueur('Ramos', 'Sergio', 37, 184, 82, 'Défenseur centrale', 5 , 'Titulaire'))
            self.Effectif = sorted(self.Effectif, key=lambda joueur: joueur.numero)
            for joueur in self.Effectif:
                item = QListWidgetItem(f"{joueur.numero}. {joueur.nom} {joueur.prenom}")
                self.listWidget.addItem(item)
            self.listWidget.itemClicked.connect(self.afficherJoueurDetails)
            self.currentJoueurIndex = self.listWidget.setCurrentRow(0)
            self.indiceListe = 0
            self.afficherJoueur()  
    
        def afficherJoueur(self):
            joueur = self.Effectif[self.indiceListe]  
            self.afNom.setText(joueur.nom)
            self.afPrenom.setText(joueur.prenom)  
            self.afAge.setText(str(joueur.age))
            self.afTaille.setText(str(joueur.taille))
            self.afPoids.setText(str(joueur.poids))
            self.afPoste.setText(joueur.poste)
            self.afNumero.setText(str(joueur.numero))
            self.afEtat.setText(joueur.etat)
    
    
        def Precedent(self):
            self.indiceListe = self.listWidget.currentRow() - 1
            if self.indiceListe < 0:
                self.indiceListe = 0
            self.listWidget.setCurrentRow(self.indiceListe)
            self.afficherJoueur()
    
        def Suivant(self):
            self.indiceListe = self.listWidget.currentRow() + 1
            if self.indiceListe == len(self.Effectif):
                self.indiceListe = len(self.Effectif) - 1
            self.listWidget.setCurrentRow(self.indiceListe)
            self.afficherJoueur()
    
        def Supprimer(self):
            self.indiceListe = self.listWidget.currentRow()
            del self.Effectif[self.indiceListe]
            self.listWidget.takeItem(self.indiceListe)
            if self.indiceListe == len(self.Effectif):  
                self.indiceListe -= 1
            self.afficherJoueur()
            
        def afficherJoueurDetails(self, item):
            joueur_index = self.listWidget.currentRow()
            joueur = self.Effectif[joueur_index]
            self.afNom.setText(joueur.nom)
            self.afPrenom.setText(joueur.prenom)
            self.afAge.setText(str(joueur.age))
            self.afTaille.setText(str(joueur.taille))
            self.afPoids.setText(str(joueur.poids))
            self.afPoste.setText(joueur.poste)
            self.afNumero.setText(str(joueur.numero))
            self.afEtat.setText(joueur.etat)
    
        def AfficherpageModifier(self):
            joueur_index = self.listWidget.currentRow()
            ihm = IHM_Modifier(self.Effectif, self.Effectif[joueur_index])
            ihm.joueur = self.Effectif[joueur_index]
            #self.Effectif[joueur_index] = joueur
            if ihm.exec_() == QDialog.Accepted:
                self.Effectif = sorted(self.Effectif, key=lambda joueur: joueur.numero)
                self.afficherJoueur()
                
        def AfficherpageAjout(self):
            ihm = IHM_Ajout(self.Effectif)  
            ihm.exec_()  
            self.afficherJoueur()  
            
    app = QApplication([])
    ihm = IHM_equipe_foot()
    ihm.show()
    app.exec_()

    Maintenant, il reste encore des coquilles, et des boutons à connecter...

    Bon courage

    1. Bonjour, 

      merci pour les corrections. 

      Maintenant les pages "modifier" et "ajouter" s'ouvrent sans souci. 

      Par contre je n'arrive pas à faire afficher l'ajout ou la motif une fois que les pages sont renseignées.. 

      je suis reparti d'un fichier ou j'ai enlevé dans chaque IHM (Ajout et modif) toutes les def pour repartir de zéro.. mais a partir de la je suis bloqué je n'arrive pas à mettre les bonnes fonctionnalités... 

      Voici mon nouveau code.py 

      ainsi que le lien de partage pour les fichiers .ui 

      https://wetransfer.com/downloads/3d82214c71a7e64ac8fc9654cd8ecfec20230704132813/eef849

      merci pour votre aide :) 

      from PyQt5.QtWidgets import *
      from PyQt5.uic import loadUi
      from PyQt5.QtWidgets import QListWidgetItem
      from PyQt5.QtGui import QPixmap
      
      class Joueur:
          def __init__(self,nom,prenom,age,taille,poids,poste,numero,etat):
              self.nom = nom
              self.prenom = prenom
              self.age = age
              self.taille = taille
              self.poids = poids
              self.poste = poste
              self.numero = numero
              self.etat = etat
              
      class IHM_Ajout(QDialog):
          def __init__(self,Effectif):
              super().__init__()
              loadUi('ajout_joueur.ui', self)
              self.Effectif = Effectif
              self.btnCancel.clicked.connect(self.annulerAjout)
              self.btnSave.clicked.connect(self.SauverAjout)
              
          def annulerAjout(self):
              self.reject()
              
          def SauverAjout(self):
              self.accept()
              
      class IHM_Modifier(QDialog):
          def __init__(self,Effectif):
              super().__init__()
              loadUi('modif_joueur.ui', self)
              self.Effectif = Effectif
              self.btnCancel.clicked.connect(self.annulerAjout)
              self.btnSave.clicked.connect(self.SauverAjout)
             
          def annulerAjout(self):
              self.reject()
              
          def SauverAjout(self):
              self.accept()
      
      class IHM_equipe_foot(QWidget):
          def __init__(self):
              super().__init__()
              loadUi ('IHM_equipe_foot.ui', self)
              self.btnSupprimer.clicked.connect(self.Supprimer)
              self.btnModifier.clicked.connect(self.AfficherpageModifier)
              self.btnAjouter.clicked.connect(self.AfficherpageAjout)
              self.btnSuivant.clicked.connect(self.Suivant)
              self.btnPrecedent.clicked.connect(self.Precedent)
              self.Effectif = []
              self.Effectif.append(Joueur('Guilhauma','Rémi',29,170,85,'Attaquant droit',11 ,'Titulaire'))
              self.Effectif.append(Joueur('Cobo','Rudy',27,173,80,'Milieu défensif',6 ,'Titulaire'))
              self.Effectif.append(Joueur('Bouffenie','Romain',39,185,87,'Milieu droit',8 ,'Titulaire'))
              self.Effectif.append(Joueur('Damourette', 'Thibault', 31, 175,73, 'Défenseur droit',2 , 'Titulaire'))
              self.Effectif.append(Joueur('Harati', 'Khadija',33 , 165, 60, 'Milieu gauche', 7 , 'Titulaire'))
              self.Effectif.append(Joueur('Stein', 'Nicolas', 39, 183, 102, 'Gardien', 1 , 'Titulaire'))
              self.Effectif.append(Joueur('Zidane', 'Zinédine', 51, 185, 78, 'Milieu offensif', 10 , 'Titulaire'))
              self.Effectif.append(Joueur('Giuly', 'Ludovic', 46, 164, 62, 'Défenseur gauche', 3 , 'Titulaire'))
              self.Effectif.append(Joueur('Mbappé', 'Killian', 24, 178, 75, 'Attaquant gauche', 9 , 'Titulaire'))
              self.Effectif.append(Joueur('Varane', 'Raphael', 30, 191, 81, 'Défenseur centrale', 4 , 'Titulaire'))
              self.Effectif.append(Joueur('Ramos', 'Sergio', 37, 184, 82, 'Défenseur centrale', 5 , 'Titulaire'))
              self.Effectif = sorted(self.Effectif, key=lambda joueur: joueur.numero)
              for joueur in self.Effectif:
                  item = QListWidgetItem(f"{joueur.numero}. {joueur.nom} {joueur.prenom}")
                  self.listWidget.addItem(item)
              self.listWidget.itemClicked.connect(self.afficherJoueurDetails)
              self.indiceListe = 0
              self.afficherJoueur()  
      
          def afficherJoueur(self):
              joueur = self.Effectif[self.indiceListe]  
              self.afNom.setText(joueur.nom)
              self.afPrenom.setText(joueur.prenom)  
              self.afAge.setText(str(joueur.age))
              self.afTaille.setText(str(joueur.taille))
              self.afPoids.setText(str(joueur.poids))
              self.afPoste.setText(joueur.poste)
              self.afNumero.setText(str(joueur.numero))
              self.afEtat.setText(joueur.etat)
      
          def Precedent(self):
              self.indiceListe -= 1
              if self.indiceListe < 0:
                  self.indiceListe = 0
              self.afficherJoueur()
      
          def Suivant(self):
              self.indiceListe += 1
              if self.indiceListe == len(self.Effectif):
                  self.indiceListe = len(self.Effectif) - 1
              self.afficherJoueur()
      
          def Supprimer(self):
              if self.currentJoueurIndex is not None:
                  del self.Effectif[self.currentJoueurIndex]
                  self.listWidget.takeItem(self.currentJoueurIndex)
                  self.currentJoueurIndex = None
                  self.afficherJoueur()
              
          def afficherJoueurDetails(self, item):
              joueur_index = self.listWidget.row(item)
              joueur = self.Effectif[joueur_index]
              self.afNom.setText(joueur.nom)
              self.afPrenom.setText(joueur.prenom)
              self.afAge.setText(str(joueur.age))
              self.afTaille.setText(str(joueur.taille))
              self.afPoids.setText(str(joueur.poids))
              self.afPoste.setText(joueur.poste)
              self.afNumero.setText(str(joueur.numero))
              self.afEtat.setText(joueur.etat)
              self.currentJoueurIndex = joueur_index
              
          def AfficherpageModifier(self):
              ihm = IHM_Modifier(self)  
              ihm.exec_()  
              self.afficherJoueur()
              
          def AfficherpageAjout(self):
              ihm = IHM_Ajout(self)  
              ihm.exec_()  
              self.afficherJoueur()  
              
      app = QApplication([])
      ihm = IHM_equipe_foot()
      ihm.show()
      app.exec_()
      1. Salut,

        Oui, c'est le problème avec les fichiers UI, difficile de retrouver ses méthodes.

        Personnellement, une fois les fichiers .ui importés de Qt Designer, je les convertis en fichier .py que j'importe comme module, donc beaucoup plus facile de s'y retrouver.

        Avec quel IDE travailles-tu ?

    2. Je travaille avec Thonny ou Pycharm. 

      D'accord, je vois par exemple à la place de mettre :

      loadUi('ajout_joueur.ui', self)

       tu copie directement le code de Qt designer ? 

      1. Alors, je l'exporte en .ui et ensuite, il est converti en .py avec la commande :

        pyuic5 input.ui -o output.py

         Pour te donner une idée voilà ce que ça donne.

        La classe Ajouter fonctionne, du moins elle ajoute le nouveau joueur, mais il faudrait sauvegarder tout ça physiquement sur le DD ;-)

        Ça va te permettre de comprendre que la lecture est plus lisible qu'avec des fichiers .ui, de plus, ça te permet également d'optimiser les dit fichiers.

        https://www.dropbox.com/scl/fi/zpjbz6brkiw2fhx5ikswe/Foot.zip?rlkey=vw9av7vo25k0rzbg70716k6zl&dl=0

    3. Oh yes c'est beaucoup plus simple effectivement avec des fichiers .py.                                          Du coup j'ai continué a travailler avec les fichiers que tu m'as envoyé et j'ai fait la partie "modifier". 

      Je pense que j'ai quelques choses de pas trop mal :)                                                                      Le seul truc qui cloche, c'est quand je clique sur modifier la fenêtre s'ouvre avec les infos du joueur sélectionné sauf le poste du joueur qui affiche Gardien systématiquement. Je ne sais pas pourquoi… 

      Je t'envoie la version modifiée :)

      Merci beaucoup en tout cas de ton aide, cela m'a énormément aidé :)

      https://wetransfer.com/downloads/f27a5205771bcfbe9ebc5eafbee2fc6020230704203308/af6331

      1. Ah ah le truc qui cloche, regarde ta méthode retranslateUi() de UI_modif_joueur.py, tu ne remarques pas un truc en plus dans les chaines de caractères de self.edtEtat.setItemText() et self.edtPoste.setItemText().

        Quelques points d'amélioration :

        • Comme dit plus haut, la lecture et la sauvegarde des joueurs sur DD.
        • Forcer la saisie d'entier dans Age, Taille et Poids pour éviter le plantage (regarde QIntValidator).
        • Les commentaires.
        • Remplacer les titres des fenêtres par un titre plus explicite.

        Optimiser les fichiers :

        Remplacer les .addItem("") par :

        self.edtNumero.addItems("" for _ in range(20))
        #...
        self.edtPoste.addItems("" for _ in range(10))

        Voir également du côté des polices, elles se répètent alors qu'elles sont identiques.

        1. Alors je ne suis pas sur de voir ce qui cloche mais il me semble remarquer que nous n'appelons pas la même méthode : "setItemtext" dans Ui_modif... et "setcurrenttext" dans IHM_equipe. Mais en faisant ces modifs rien ne change... 

          Pour le reste j'ai pris en compte toutes tes remarques :)

          Par contre je viens de remarquer également que j'avais ajouté un logo sur le fichier principale .ui il apparait bien sur l'interface Qt designer mais pas quand je lance le programme... 

          1. Ah Ah, j'avoue que c'est vicieux, mais certains de tes setItemtext() ont un espace en fin de chaine, idem dans UI_ajout_joueur.py, il manque aussi les accents sur "Defenseur" ;-)

            Python 3.11.0 (v3.11.0:deaf509e8f, Oct 24 2022, 14:43:23) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
            Type "help", "copyright", "credits" or "license" for more information.
            
            >>> "Milieu gauche" == "Milieu gauche "
            False
            >>> "Défenseur gauche" == "Defenseur gauche "
            False
            >>> 
            

            Pour le logo, il faut que tu enregistres ton png dans ton répertoire de travail et que tu modifies la ligne  341 de UI_equipe_foot.py

            1. ahah sacrément vicieux, absolument pas vu celle la ^^ mais du coup impeccable cela fonctionne très bien maintenant :)

              J'ai mon fichier logo en .png avec le raccourci créé sur Qtdesigner .qrc dans le dossier.

              Et j'ai ces lignes mais que veux tu que je modifie ? le lien est le bon.

              self.label_2.setPixmap(QtGui.QPixmap(":/logo /logotype-seul-couleur-RVB.png"))
              self.label_2.setScaledContents(True)
              self.label_2.setObjectName("label_2")
              1. Par exemple, dans mon répertoire de travail, j'ai un sous-répertoire nommé Logos qui contient "mon_image.png"

                la modif c'est :

                self.label_2.setPixmap(QtGui.QPixmap("Logos/mon_image.png"))
            2. Ok tout simplement.

              Bon beh écoute j'ai plus qu'à continuer à faire les petites améliorations que tu m'as donné, et surtout à te remercier pour ta grande aide !!

              Tu m'as sauvé :) 

              Merci encore à toi!

              Bonne journée 

              Rémi 

              1. Cool, n'hésite pas à revenir si tu rencontres des problèmes ;-)

                Important aussi, c'est le contrôle, par exemple dans "UI_ajout_joueur.py", s'assurer que tous les QLineEdit ne soit pas vide afin d'éviter le plantage à la validation.....

                Bonne journée.

                1. De mon côté, j'ai amélioré certaines choses qui pourront t'inspirer.

                  https://www.dropbox.com/scl/fi/pula85ndquvcc33ktrjhb/Foot-2.zip?rlkey=e4gtcryzd35su3f9dv6vfx1sq&dl=0

                  1. Ouppss !!!

                    https://www.dropbox.com/scl/fi/yixi9lo8pyofma3vbf2ry/Foot-2.zip?rlkey=rm0zemqvqwr23o7e272tkc1pw&dl=0