Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/11/2021, à 11:39

DonutMan75

PyQt5 : question sur l'intialisation de classe

Bonjour à tous,

je suis le livre de Benoît Prieur "PyQt5 Développez vos interfaces graphiques en Python" et j'ai une interrogation concernant un des exemples qu'il donne.

Objectif : réaliser une interface graphique arbitraire présentant trois onglets. Ceci permet de mettre en évidence l'utilisation du widget QTabWidget.

Voici mon code (qui fonctionne correctement même si je ne sais pas s'il est bien écrit) :

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QComboBox, QTabWidget, QPushButton, QVBoxLayout, QHBoxLayout, QGridLayout, QFormLayout
from PyQt5.QtCore import Qt

class mestabs(QTabWidget):
    def __init__(self):
        super().__init__()
        
        self.o1 = QWidget()
        self.o2 = QWidget()
        self.o3 = QWidget()
        
        self.addTab(self.o1, 'Personne')
        self.addTab(self.o2, 'Pratique')
        self.addTab(self.o3, 'Loisirs')
        
        self.creation_1()
        self.creation_2()
        self.creation_3()
        
    def creation_1(self):
        d = QFormLayout()

        x1 = QLabel('Nom : ')
        y1 = QLineEdit()
        d.addRow(x1, y1)
        
        x2 = QLabel('Prenom : ')
        y2 = QLineEdit()
        d.addRow(x2, y2)   
        
        self.o1.setLayout(d)
        
    def creation_2(self):
        d = QFormLayout()

        x3 = QLabel('Pratique sportive : ')
        y3 = QComboBox()
        y3.addItems(['Ski', 'Foot', 'Badminton'])
        d.addRow(x3, y3)   
        
        self.o2.setLayout(d)  
        
    def creation_3(self):
        d = QFormLayout()

        x4 = QLabel('Pratique culturelle : ')
        y4 = QComboBox()
        y4.addItems(['Lecture', 'Musée', 'Concerts'])
        d.addRow(x4, y4)   
        
        self.o3.setLayout(d)          
        
app = QApplication([])
fenetre = mestabs()

fenetre.show()
app.exec_()

Dans le code donné dans le livre, c'est assez similaire hormis la première ligne qui suit la fonction d'intialisation.

Chez moi :

class mestabs(QTabWidget):
    def __init__(self):
        super().__init__()
        [...]

Dans le livre :

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        super(mestabs, self).__init__(parent)
        [...]

Je ne maîtrise pas bien la fonction super() et ne comprends donc pas très bien la différence entre ces deux codes...
Les deux semblent fonctionner et donnent le même résultat...

Qu'en pensez-vous ?

Merci par avance smile

D.

Hors ligne

#2 Le 15/11/2021, à 15:29

MPython Alaplancha

Re : PyQt5 : question sur l'intialisation de classe

Bonjour,
Lorsque tu écris:

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        super(mestabs, self).__init__(parent)

cela correspond à:

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        QTabWidget.__init__(self, parent)

Depuis python3, tu peux utiliser super() sans qu'il soit necessaire d'en expliciter les arguments:

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        [...]

édit: code

Dernière modification par MPython Alaplancha (Le 15/11/2021, à 16:52)


# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne

#3 Le 15/11/2021, à 16:26

DonutMan75

Re : PyQt5 : question sur l'intialisation de classe

Bonsoir pseudofab,

bon je réalise que ma question concerne finalement plus l'implémentation de la POO dans Python plutôt que PyQt5...

Quand je lis :

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

Je comprends :
- la classe mestabs hérite de la classe QTabWidget
- la méthode __init__ de mestabs, si elle ne fais pas appel à super() ou équivalent, écrase la méthode __init__ de QTabWidget
- si au début de __init__ de mestabs on indique super().__init__, cela signifie qu'on commence par initialiser l'objet sur la méthode QTabWidget.__init__ puis ensuite éventuellement on fait d'autres trucs (propre à mestabs donc...)

Je comprends de ton message que le bout de code ci-dessous est équivalent...

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        mestabs.__init__(self, parent)

... mais je ne comprends pas du tout la syntaxe... Je vois un appel récursif à la méthode mestabs.__init__...

Je vais réviser mes cours sur la POO en Python ^^
Merci d'avoir pris le temps de me répondre smile

D.

Dernière modification par DonutMan75 (Le 15/11/2021, à 16:27)

Hors ligne

#4 Le 15/11/2021, à 16:48

MPython Alaplancha

Re : PyQt5 : question sur l'intialisation de classe

excuse, il y a une erreur dans le code que je t'ai donné:
C'est

class mestabs(QTabWidget):
    def __init__(self, parent=None):
        QTabWidget.__init__(self, parent)

# Là pour le plaisir de découvrir ...
# Envie d'apprendre Bash ou Python? Pensez aux MOOC ---> https://forum.ubuntu-fr.org/viewtopic.php?id=2030646

Hors ligne